[начинаем рассматривать важнейшие директивы конфигурации РНР]материал подготовил: Александр Лозовюк 13.07.2005
Если спросить веб-программиста, какой из всех файлов дистрибутива PHP является самым главным, многие могут ответить, что сам интерпретатор, библиотеки, расширения и т. д. Нет, самый важный файл — это php.ini: небольшой текстовый файлик, в котором содержатся все настройки РНР (директивы), конфигурации модулей расширения и переменные среды. Через файл конфигурации можно настроить РНР на максимальное быстродействие, отключить потенциально опасные функции и модули, ну и, конечно, при неудачной настройке нарушить работу всей системы (нет, не всего сервера, максимум веб-сервера и РНР).
Но значение системных переменных можно установить не только через php.ini, но и другии методами, правда, с ограничениями. Для понимания этого следует вкратце рассмотреть механизм обработки конфигурационных файлов средой РНР.
Во первых, в самом простом случае, когда РНР работает как CGI-приложение, файл перечитывается каждый раз при запуске интерпретатора. Если же он подключается как SAPI-модуль к серверу Apache, то тогда путь к файлу определяется директивой PHPIniDir конфигурации сервера.
Если после этого конфигурационный файл не найден, его поиски продолжаются в следующих местах: для Win32-сервера проверяется ключ в реестре HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath, далее файл ищется в текущем каталоге, откуда запущен интерпретатор (php-cli.exe), в корневой директории веб-сервера (для SAPI-модуля) или в корневой директории РНР. Потом поиск продолжается в системных директориях (C:\WINDOWS, C:\WINXP, C:\SYSTEM32) и в директории, заданной на этапе сборки РНР опцией ‘—with-config-file-path’.
Кроме этого, сами опции могут указыватся в разных файлах, к примеру в файлах конфигурации сервера Apache (httpd.conf), в файлах .htaccess (для отдельных директорий сайта), в отдельных файлах php.ini, помещаемых в директории со скриптами, и даже в самих РНР-скриптах через вызов функции ini_set(). В зависимости от того, где и каким образом устанавливается переменная, она будет иметь различный эффект — для текущего скрипта, для отдельного сайта или директории, для всего сервера до перезагрузки.
Для чего такое разнообразие? Очень просто. К примеру, в типичной ситуации, когда ваш сайт располагается на виртуальном хостинге, вы лишены возможности перенастроить конфигурацию РНР для себя, в то же время для нормальной работы скриптов вам необходимо установить некоторые переменные, отличные от установок хостера. Тогда вы просто устанавливаете в директориях своего сайта файл php.ini, в котором и прописываете все нужные вам настроки. Если же необходимо изменить всего одну-две переменные, то это можно сделать через вызов функции ini_set() в начале скрипта. Но обратите внимание на один момент. Так как ini_set() является РНР-функцией и, соответственно, исполняется уже после инициализации интерпретатора, то некоторые установки будут проигнорированы, так как влияют на работу только в начальном этапе запуска РНР. Не переживайте, такие параметры, как и ошибочные (синтаксически) неверные, будут просто проигнорированы и не приведут к каким-либо последствиям в работе.
Приведем практический пример. Есть такая директива, error_reporting, которая указывает на степень детализации вывода сообщений про ошибки в ходе интерпретации РНР-скрипта. Ее можно настроить на вывод как всех сообщений, так и просто предупреждений, не влияющих на работу программы. Вы можете для себя перенастроить ее, к примеру, разрешая показывать только критические для выполнения ошибки. В таком случае переменная должна содержать значение «E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR» — то есть выводить ошибки компилятора, критические ошибки среды и ядра. Установить переменную можно с помощью вызова функции ini_set(), которая принимает два строковых параметра: первая строка описывает название опции, а вторая — новое значение. В нашем случае это: ini_set(‘error_reporting’, ‘E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR’); . Вот и все, в результате РНР будет при каждом запуске вашего скрипта использовать новое значение переменной error_reporting, для всех остальных же пользователей останется значение по умолчанию, описанное в php.ini.