Dutch PHP Conference 2025 - Call For Papers

Файл конфігурації

Файл конфігурації (php.ini) читається під час запуску PHP. Для версії PHP, яка запускається як модуль, це відбувається тільки під час старту веб-сервера. Для випадку, коли PHP використовується як CGI або як CLI, це відбувається під час кожного запуску.

php.ini шукається в наступних розташуваннях (за таким порядком):

  • Спеціальне розташування модуля SAPI (визначається директивою PHPIniDir в Apache 2, параметром -c в командному рядку в CGI та CLI).
  • Змінна оточення PHPRC.
  • Розташування файлу php.ini можна визначати для кожної версії PHP окремо. Корінь ключів регістру залежить від розрядності ОС та PHP. Для 32-бітного PHP у 32-бітній ОС чи 64-бітного PHP у 64-бітній ОС використовується [(HKEY_LOCAL_MACHINE\SOFTWARE\PHP], натомість для 32-бітних версій PHP у 64-бітній ОС використовується [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]]. Коли розрядність співпадає, ключі регістру обробляються в такому порядку: [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] та [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x], де x, y та z означають мажорні, мінорні та патч- випуски. Для 32-бітних версій PHP на 64-бітних ОС ключі регістру обробляються в такому порядку: [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y] та [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x], де x, y та z означають мажорні, мінорні та патч- випуски. Якщо значення для IniFilePath знаходиться в будь-якому з цих ключів, воно буде використовуватись як розташування файла php.ini (тільки у Windows).
  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP] або [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP], значення IniFilePath (тільки у Windows).
  • Поточна робоча тека (за виключенням CLI).
  • Тека вебсервера (для модуля SAPI), або тека PHP (в іншому випадку - тека Windows).
  • Тека Windows (C:\windows або C:\winnt) (для Windows), або параметр --with-config-file-path під час компіляції.

Якщо php-SAPI.ini існує (де SAPI означає - SAPI, що використовується, наприклад, php-cli.ini або php-apache.ini), його буде використано замість php.ini. Назву SAPI можна знайти використовуючи функцію php_sapi_name().

Зауваження:

Веб-сервер Apache змінює теку на кореневу на старті, в результаті чого PHP читає файл php.ini з кореневої теки, якщо він там існує.

Змінні оточення можна використовувати в php.ini як показано нижче.

Приклад #1 Використання Змінних Оточення в php.ini

; PHP_MEMORY_LIMIT бере значення із оточення
memory_limit = ${PHP_MEMORY_LIMIT}

Директиви php.ini, що обробляються через розширення, мають опис на відповідних сторінках розширень. Список директив ядра знаходиться в додатку. Не всі PHP-директиви описані в цьому посібнику: повний їх список можна знайти в коментарях файлу php.ini вашої версії PHP. Окрім цього, можна прочитати » останню версію файлу php.ini зі сховища Git.

Приклад #2 Частина вмісту з файлу php.ini

; будь-який текст після символів крапки-з-комою (;) ігнорується
[php] ; маркери розділів (текст вередині квадратних дужок) також ігнорується
; Логічні значення можуть встановлюватись такими записами:
;    true, on, yes
; або false, off, no, none
register_globals = off
track_errors = yes

; рядок можна взяти в подвійні дужки
include_path = ".:/usr/local/lib/php"

; зворотні слеші сприймаються точно так як і інші символи
include_path = ".;c:\php\lib"

Дозволено посилатись на наявні змінні .ini з середини файлу .ini. Наприклад: open_basedir = ${open_basedir} ":/new/dir".

Пошук файлів .ini в теках

Дозволено налаштувати PHP для пошуку файлів .ini в теці вже після обробки php.ini. Для цього, під час компіляції, вказується опція --with-config-file-scan-dir. Цільову теку можна перепризначити у ході виконання коду, задавши потрібне значення змінній середовища PHP_INI_SCAN_DIR.

Для пошуку в різних теках треба відокремити їх роздільником шляхів (; у Windows, NetWare та RISC OS; : на всіх інших платформах; значення, що використовує PHP, доступне як константа PATH_SEPARATOR). Якщо в PHP_INI_SCAN_DIR вказано порожню теку, PHP виконає пошук в теці, заданій під час компіляції опцією --with-config-file-scan-dir.

В кожній теці PHP буде вибирати всі файли з закінченням .ini у алфавітному порядку. Список оброблених файлів та їхній порядок повертає php_ini_scanned_files(), або PHP, запущений з опцією --ini.

Припускається, що PHP налаштовано з --with-config-file-scan-dir=/etc/php.d,
а роздільник — :...

$ php
  PHP обробить всі файли /etc/php.d/*.ini як файли конфігурації.

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php
  PHP обробить всі файли /usr/local/etc/php.d/*.ini як файли конфігурації.

$ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php
  PHP обробить всі файли /etc/php.d/*.ini, потім
  /usr/local/etc/php.d/*.ini як файли конфігурації.

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
  PHP обробить всі файли /usr/local/etc/php.d/*.ini, потім
  /etc/php.d/*.ini  як файли конфігурації.
add a note

User Contributed Notes 4 notes

up
27
weili
3 years ago
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.
up
3
Pictor13
9 months ago
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.
up
0
michael at maildrop dot cc
1 month ago
I'm not sure why the comment saying you can use constants is downvoted so much. This is amazing news and just what I was looking for.

Having a configuration like:
php_admin_value[error_log] = "/logfolder/php-fpm-"PHP_VERSION".$pool.log"

will nicely log to /logfolder/php-fpm-8.3.10.mypool.log , which is really useful if you have multiple versions of PHP running and want to keep your log files separate and not have to fiddle with the configuration each time you update. A list of the pre-defined constants is here ( https://www.php.net/manual/en/reserved.constants.php#reserved.constants.core ) The PHP_*_VERSION, PHP_VERSION, PHP_OS_FAMILY, and maybe PHP_SAPI are useful in this case.
up
-6
atv dot seth at gmail dot com
9 months ago
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
To Top