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

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

PHP ищёт файл php.ini в следующих местах (по порядку поиска):

  • По расположению конкретного SAPI-модуля (директива PHPIniDir в веб-сервере Apache 2, параметр командной строки -c в CGI- и CLI-интерфейсе)
  • Переменная окружения PHPRC.
  • Расположение файла 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).
  • Текущая рабочая директория (исключая CLI-интерфейс).
  • Директория веб-сервера (для SAPI-модулей) или директория PHP (иначе в Windows).
  • Директория ОС Windows (C:\windows или C:\winnt) (для 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 разрешается указывать переменные окружения, как показывает следующий пример.

Пример #1 Переменные окружения в файле php.ini

; Переменную PHP_MEMORY_LIMIT получили из окружения
memory_limit = ${PHP_MEMORY_LIMIT}

Директивы файла 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 как конфигурационные.
Добавить

Примечания пользователей 4 notes

up
26
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
1
Pictor13
11 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
2 months 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
10 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