Директивы "php.ini" можно определять не только в главном конфигурационном файле php.ini, а и в пользовательских скриптах, в главном конфигурационном файле веб сервера Apache "httpd.conf" и пользовательском файле конфигурации (обычно .htacces), а также в любых из перечисленных выше местах.
В этой статье мы рассмотрим все особенности использования директив конфигурационного файла php.ini, к какой категории относится та или иная директива, где и как её можно определить.
На странице официальной справки по РНР дается пояснение где могут определятся директывы php.ini относящиеся к той или иной категории, согласно справке в РНР существуют такие категории директив:
Mode Value Meaning -------------------------------------------- PHP_INI_USER 1 Значение может быть установлено в пользовательских скриптах (с помощью ini_set()) или в реестре Windows PHP_INI_PERDIR 6 Значение может быть установлено в php.ini, .htaccess или httpd.conf PHP_INI_SYSTEM 4 Значение может быть установлено в php.ini или httpd.conf PHP_INI_ALL 7 Значение может быть установлено отовсюду
Из приведённой выше таблицы можно определить какие категории директив php.ini и каких местах (скрипты пользователя, php.ini, .htaccess, httpd.conf или везде) разрешено определять директиву относящуюся к той или иной категории. Полный список директив, а также их принадлежность к той или иной категории можно найти на официальной странице РНР "Список директив php.ini".
Так, например, директиву "browscap" которая относится к категории "PHP_INI_SYSTEM" мы не сможем определить в пользовательском конфигурационном файле ".htaccess", потому как директивы "php.ini" относящиеся к категории "PHP_INI_SYSTEM" и такие директивы позволено определять только в "php.ini" или "httpd.conf":
# httpd.conf php_value browscap "/path/browscap/browscap.ini" ; php.ini ;browscap = extra/browscap.ini
Существует четыре директивы при помощи которых можно манипулировать настройками конфигурационного файла "php.ini": php_value, php_flag, php_admin_value, php_admin_value и php_admin_flag
. Далее даётся подробное описание каждой из них.
php_value name value - Устанавливает значение обозначенной директивы. Может использоваться только с директивами типа PHP_INI_ALL и PHP_INI_PERDIR Для очистки предыдущих установленных значений используйте значение none. Замечание: Не используйте php_value для установки логических значений. Вместо этого необходимо использовать php_flag (см. ниже).
php_flag name on|off - Используется для установки директивам логических значений. Может быть использовано только с директивами типа PHP_INI_ALL и PHP_INI_PERDIR.
php_admin_value name value - Устанавливает значение обозначенной директивы. Не может быть использовано в файлах .htaccess. Директивы любого типа, установленные с помощью php_admin_value не могут быть переопределены через .htaccess или ini_set(). Чтобы очистить предыдущее значение используйте значение none.
php_admin_flag name on|off - Используется для установки директивам логических значений. Не может быть использовано в файлах .htaccess. Директивы любого типа, установленные с помощью php_admin_flag не могут быть переопределены через .htaccess или ini_set().
Таким образом если мы хотим изменить настройки РНР в пользовательском конфигурационном файле ".htaccess", то для этого мы можем использовать только директивы "php_value" и "php_flag", а изменить сможем только те директивы конфигурационного файла "php.ini" которые относятся к категории PHP_INI_ALL или PHP_INI_PERDIR.
"php_value" и "php_flag" - это, что касается пользовательского конфигурационного файла ".htaccess", а когда же мы хотим изменить настройки "php.ini" прямо из РНР скрипта, то в этом случае мы должны использовать функцию ini_set(string varname, string newvalue) для директив относящихся к категории "PHP_INI_USER" или "PHP_INI_ALL".
Под занавес небольшое замечание по использованию "php_value" и "php_flag" в пользовательском конфигурационном файле ".htaccess". Использование этих директив php в пользовательском конфигурационном файле ".htaccess" становится возможным только при подключении PHP в качестве модуля и при наличии привилегий AllowOverride, которые должны быть определены либо в значение Options, либо в значение All для всего сервера или же для каждого хоста отдельно:
AllowOverride All ..............