Файл конфигурации
Файл конфигурации (php.ini) считывается при запуске PHP. Для версий серверных модулей PHP это происходит только один раз при запуске веб сервера. Для CGI и CLI версий это происходит при каждом вызове.
Поиск php.ini производится в следующих местах (по порядку поиска):
- По месту расположения модуля SAPI (PHPIniDir директива Apache 2, -c параметр командной строки CGI и CLI, php_ini параметр в NSAPI, PHP_INI_PATH переменная среды в THTTPD)
- Переменная среды PHPRC. До PHP 5.2.0 поиск по переменной производился после поиска в реестре, указанном ниже.
- Как и в PHP 5.2.0, местоположение файла php.ini может быть указано для различных версий 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 подразумевают major, minor и release версии PHP. Если также имеется значение IniFilePath в любом из этих ключей, то местонахождение php.ini будет определено первым ключом по порядку. (только для Windows).
- [HKEY_LOCAL_MACHINE\SOFTWARE\PHP], значение IniFilePath (только для Windows).
- Текущая директория (исключая CLI).
- Директория веб сервера (для SAPI модулей), или директория PHP (иначе в директории Windows).
- В директории Windows (C:\windows или C:\winnt) (для Windows), или --with-config-file-path с выбором при компиляции.
Если файл php-SAPI.ini существует (где SAPI - это тип интерфейса, который используется, например, php-cli.ini или php-apache.ini), то он используется вместо php.ini. Тип интерфейса между веб-сервером и PHP может быть определен с помощью функции php_sapi_name().
Замечание:
Веб сервер Apache изменяет текущую директорию на корневую при запуске, в результате чего PHP считывает php.ini из корневой файловой системы, если файл существует.
В php.ini можно использовать переменные окружения, как показано в примере ниже.
Пример #1 php.ini Environment Variables
; PHP_MEMORY_LIMIT берется из окружения memory_limit = ${PHP_MEMORY_LIMIT}
Директивы 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"
С версии PHP 5.1.0 стало возможным обращаться к существующим ini-переменным из ini-файлов. Пример: open_basedir = ${open_basedir} ":/new/dir".
Коментарии
Also a nice feature is the ability to use PHP's contants:
For example:
extension_dir=""PHP_MAJOR_VERSION"."PHP_MINOR_VERSION"/ext"
This solution works for me when I needed to force two diferent versions of PHP on a Windows Server 2012 r2 & IIS:
For one application, map *.php extension to a CgiModule adding the "-c" option to the executable path, like this: "C:\php53\php-cgi.exe -c C:\php53\php.ini"
For the other application, map *.php extension to a CgiModule adding the "-c" option to the executable path, like this: "C:\php54\php-cgi.exe -c C:\php54\php.ini"
I think that way is the cleanest, because there is no need to work with PATH variable or Registry or Windows directory.
Note: for some reason, this didn't work on FastCGI module, related to the way that IIS set the executable tab not allowing command line options.
If you have multiple installations of PHP, and "php --ini" keeps loading the same configuration file for every version instead of the configuration file on the installation path, it might be worthy to check the windows registry.
I found a key on "HEKY_LOCAL_MACHINE\SOFTEARE\Wow6432Node\PHP\IniFilePath" that override any installation, which cause "php --ini" to crash stating a version mismatch with the extensions being loaded.
Deleting the key "HEKY_LOCAL_MACHINE\SOFTEARE\Wow6432Node\PHP" solved the problem.
I guess the key was created with a windows installer for IIS on FastCGI, but just guessing.
For the record, some of the errors thrown are:
"The procedure entry point php_sys_stat could not be located in the dynamic link library php5.dll. "
"The procedure entry point php_checkuid could not be located in the dynamic link library php5.dll. "
Hope someone with such a mess will find this useful.
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 . "/";
example #2 says "[php] ; section markers (text within square brackets) are also ignored" - yet if you remove these 'section markers' everything breaks, - which means they're *not* ignored.