PHP 8.4.2 Released!

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

Файл конфігурації (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 2 notes

up
24
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
2
Pictor13
1 year 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.
To Top