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

Файл конфигурации (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 как конфигурационные.
add a note

User Contributed Notes 4 notes

up
25
weili
2 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
7 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
-6
atv dot seth at gmail dot com
7 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
up
-52
ohcc at 163 dot com
7 years ago
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 . "/";
To Top