For someone who's also wondering.
PHP can work even if there is no configuration file(php.ini) loaded,
it will simply applies the default values to directives.
Yapılandırma dosyası (php.ini) PHP başlatıldığında okunur. PHP'nin sunucu modülü sürümlerinde bu işlem bir kereliğine HTTP sunucusu başlatıldığında gerçekleşir. CGI ve CLI sürümlerinde ise PHP'nin her çağrılışında işlem tekrarlanır.
php.ini sırasıyla şuralarda aranır:
SAPI modülüne özgü konum (Apache 2'de PHPIniDir
yönergesi, CGI ve CLI için -c
komut satırı seçeneği)
PHPRC ortam değişkeni.
php.ini
dosyasının konumu
PHP'nin farklı sürümleri için ayarlanabilmektedir. Kayıt defteri
anahtarlarının kökü, kurulu işletim sistemi ve PHP'nin 32 veya 64 bit
oluşuna bağlıdır. 32 bit işletim sisteminde 32 bit PHP veya 64 bit
işletim sisteminde 64 bit PHP için [(HKEY_LOCAL_MACHINE\SOFTWARE\PHP],
64 bit işletim sisteminde 32 bit PHP sürümü için bunu yerine
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]] kullanın. Aynı bitlik
kurulum için kayıt defteri anahtarları aşağıdaki sırayla incelenir:
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z]
,
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y]
ve
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x]
.
Burada x, y ve z harfleri PHP'nin ana, alt ve yama sürümlerini
belirtir. 64 bit işletim sisteminde PHP'nin 32 bit sürümleri için kayıt
defteri anahtarları aşağıdaki sırayla incelenir:
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z]
,
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y]
ve
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x]
.
Burada x, y ve z harfleri PHP'nin ana, alt ve yama sürümlerini
belirtir. Bu anahtarlarda bir IniFilePath
değeri
varsa ilk bulunan php.ini
konumu kullanılır
(sadece Windows).
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
or
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]
anahtarının \IniFilePath
değeri (sadece Windows).
Geçerli çalışma dizini (CLI dışında)
HTTP sunucusunun dizini (SAPI modülleri için) veya PHP dizini (Windows için)
Windows dizini (C:\windows
veya C:\winnt) (Windows için)
veya --with-config-file-path
derleme seçeneği ile
belirtilen dizin.
php-SAPI.ini mevcutsa (burada SAPI, kullanılan SAPI'dir, dolayısıyla php-cli.ini veya php-apache.ini gibi bir dosya ismidir), php.ini yerine bu dosya kullanılır. SAPI ismi php_sapi_name() işlevi ile saptanabilir.
Bilginize:
Apache HTTP sunucusunun başlatıldığında kök dizine geçmesi PHP'nin php.ini dosyasını dosya sisteminin kök dizininde aramasına sebep olur.
php.ini içinde kullanılabilen ortam değişkenlerinin kullanımı aşağıda gösterilmiştir.
Örnek 1 - php.ini Ortam Değişkenleri
; PHP_MEMORY_LIMIT'in ortamdan alınışı memory_limit = ${PHP_MEMORY_LIMIT}
php.ini yönergelerinin eklentilerle ilgili olanlarının belgeleri her eklentinin kendi belgeleri içindedir. Temel yönergelerin listesini eklerde bulabilirsiniz. Tamamı olmasa da yönergelerin büyük çoğunluğu kılavuzda belgelenmiş durumdadır. Kurulu PHP sürümünüzde geçerli yönergelerin tam listesi için kendi içinde iyi açıklanmış php.ini dosyanızı okuyun. Ayrıca, Git'te bulunan » en son php.ini dosyası da bu konuda size yardımcı olabilir.
Örnek 2 - php.ini örneği
; bir noktalı virgülden (;) sonra gelen tüm metin parçaları yok sayılır [php] ; bölüm imleyiciler de (köşeli ayraç içindeki metinler) yok sayılır ; Mantıksal değerler için şu değerlerden herhangi biri kullanılabilir: ; true, on, yes ; false, off, no, none register_globals = off track_errors = yes ; Dizgeleri çift tırnak imlerinin arasında belirtebilirsiniz include_path = ".:/usr/local/lib/php" ; tersbölü karakterleri diğer karakterler gibi ele alınır include_path = ".;c:\php\lib"
.ini dosyalarında bulunan yönergelere isimleriyle değişken olarak
erişilebilir. Örnek:
open_basedir = ${open_basedir} ":/new/dir"
.
PHP'yi, php.ini'yi okuduktan sonra bir dizindeki .ini dosyalarını tarayacak şekilde yapılandırmak mümkündür. Bu, --with-config-file-scan-dir seçeneği ayarlanarak derleme sırasında yapılabilir. Tarama dizini daha sonra çalışma anında PHP_INI_SCAN_DIR ortam değişkeni ayarlanarak geçersiz kılınabilir.
Birden fazla dizini platforma özgü yol ayırıcıyla ayırarak taramak
mümkündür (Windows, NetWare ve RISC OS için ;
diğer
tüm platformlarda :
kullanılır. PHP'nin kullandığı
değer PATH_SEPARATOR
sabiti olarak mevcuttur).
PHP_INI_SCAN_DIR'de boş bir dizin verilmişse,
PHP ayrıca derleme sırasında
--with-config-file-scan-dir seçeneği
ile verilen dizini de tarayacaktır.
PHP her dizinde, PHP .ini
uzantılı tüm dosyaları
alfabetik sırayla tarar. php_ini_scanned_files()
işlevi ile veya PHP'yi --ini seçeneğiyle çalıştırarak
yüklenen dosyaların bir listesi ve sırası elde edilebilir.
PHP'nin --with-config-file-scan-dir=/etc/php.d ile yapılandırıldığını ve yol ayırıcının : olduğunu varsayalım ... $ php PHP /etc/php.d/*.ini dosyalarının tamamını yapılandırma dosyaları olarak yükler $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php PHP /usr/local/etc/php.d/*.ini dosyalarının tamamını yapılandırma dosyaları olarak yükler $ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php PHP /etc/php.d/*.ini ve ardından /usr/local/etc/php.d/*.ini dosyalarının tamamını yapılandırma dosyaları olarak yükler $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php PHP /usr/local/etc/php.d/*.ini ve ardından /etc/php.d/*.ini dosyalarının tamamını yapılandırma dosyaları olarak yükler
For someone who's also wondering.
PHP can work even if there is no configuration file(php.ini) loaded,
it will simply applies the default values to directives.
Notice that `error_reporting` CANNOT be interpolated with an environment variable (e.g. `error_reporting = ${PHP_ERROR_REPORTING}`).
`error_reporting` is treated differently than other directives:
if assigned an environment variable, this will be silently ignored and replaced with value `0` (aka no-reporting).
I couldn't find documentation about it.
Is maybe an info that should be added in https://github.com/php/php-src/blob/8f5156fcba9906664ecd97e4c279ee980e522121/php.ini-production#L451-L500 ?
I am not aware if this specific behavior affects only `error_reporting` or also other directive.
For anyone who wants to ignore any directory entirely
On a linux Redhat distro (this was on EL9):
; if using php-fpm, put this file in place"
/etc/systemd/system/php-fpm.service.d/override.conf
[Service]
Environment="PHP_INI_SCAN_DIR="
; do a systemd config reload:
systemctl daemon-reload
; if you want to make sure php on the cli fails if it's not passing 'PHP_INI_SCAN_DIR= php' (this should also affect both linux normal+system users?) then drop this file in place:
cat /etc/php.d/00-dont-use-phpd.ini
auto_prepend_file=MISSING_ENV__PHP_INI_SCAN_DIR__SEE_ETC_PHPD_00_DONT_USE_PHPD_INI
; don't allow php.d directory to load in files
; you must pass 'PHP_INI_SCAN_DIR= ' before your php command on the cli
; reference:
; https://www.php.net/manual/en/configuration.file.php#configuration.file.scan
in php.ini you can reference to an existing directive or an environment variable using the syntax ${varname}.
Here are some examples.
sys_temp_dir = "${WINDIR}"
--- ${WINDIR} will be replaced by $_ENV['WINDIR'] at runtime
--- you can set environment variables by Apache and use them in php.ini
--- FcgidInitialEnv AUTHOR "WUXIANCHENG"
--- error_log = "${AUTHOR}.log"
error_log = "${sys_temp_dir}"
--- ${sys_temp_dir} will be replace by the value of sys_temp_dir
Also you can use PHP constants in php.ini, but DONT'T wrap them in ${} or "".
error_log = "/data/"PHP_VERSION"/"
--- it works like this php code:
$error_log = "/data/" . PHP_VERSION . "/";