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.
Файл конфигурации (php.ini) считывается при запуске PHP. Для версий серверных модулей PHP это происходит только один раз при запуске веб-сервера. Для CGI- и CLI-версии PHP — при каждом вызове.
PHP ищёт файл php.ini в следующих местах (по порядку поиска):
PHPIniDir
в веб-сервере Apache 2, параметр командной строки -c
в CGI- и CLI-интерфейсе)
php.ini
зависит от версии PHP.
Корень ключей реестра ОС зависит от разрядности ОС и PHP. При установке 32-разрядного PHP
на 32-разрядной ОС Windows или 64-разрядного PHP на 64-разрядной Windows
PHP исследует раздел реестра [(HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
,
при установке 32-разрядного PHP на 64-разрядной Windows —
раздел [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]
.
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 подразумевают мажорную, минорную и точечную версии выпусков PHP.
Для 32-разрядного PHP на 64-разрядной ОС Windows ключи реестра будут другими:
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z]
,
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y]
и [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x]
.
PHP будет использовать первый найденный ключ как расположение файла
php.ini
, если ключи содержат
значение IniFilePath
(только для ОС Windows).
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
или [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]
, значение
IniFilePath
(только для Windows).
--with-config-file-path
.
Вместо файла php.ini PHP будет работать с файлом php-SAPI.ini, где SAPI — текущий интерфейс, например php-cli.ini или php-apache.ini, если файл SAPI-интерфейса существует. Название SAPI-интерфейса между веб-сервером и PHP узнают через функцию php_sapi_name().
Замечание:
Веб-сервер Apache изменяет текущую директорию на корневую при запуске, в результате чего PHP считывает файл php.ini из корневой файловой системы, если файл существует.
В значениях конфигурации в файле php.ini разрешается ссылаться на значения переменных окружения, как показывает следующий пример. Начиная PHP 8.3.0 доступно определение резервных значений, которые директивы принимают, если сослались на неопределённую переменную.
Пример #1 Переменные окружения в файле php.ini
; Переменную PHP_MEMORY_LIMIT получили из окружения memory_limit = ${PHP_MEMORY_LIMIT} ; Резервное значение директивы будет равняться 30, если переменную окружения PHP_MAX_EXECUTION_TIME не определили max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
Директивы файла php.ini, которые обрабатываются модулями, описывают страницы модулей. Список директив ядра приводит приложение «Директивы php.ini». Не каждая PHP-директива задокументирована в руководстве: полный список доступных в установленной версии PHP директив изложили в подробных комментариях файла php.ini. » Последнюю версию 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"
.
Существует возможность сконфигурировать 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 как конфигурационные.
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.