[продолжаем рассматривать важнейшие директивы конфигурации РНР]материал подготовил: Александр Лозовюк 15.07.2005
В предыдущей статье цикла мы начали рассматривать системные переменные или директивы РНР, которые устанавливаются через файл php.ini и позволяют тонко настроить среду исполнения РНР. Сейчас мы продолжим знакомство с наиболее важными директивами — знание и понимание механизма их действия позволят вам полностью управлять работой РНР, построить более защищенную веб-ситему или повысить производительность своего приложения.
Мы будем рассматривать конфигурацию РНР версии 5.0.х, так что, если у вас более раняя версия, некоторые директивы могут отсутствовать.
display_startup_errors = [Off/On] — управляет отображением сообщений про ошибки на этапе инициализации и запуска РНР-интерпретатора. Присоединяясь к рекомендации разработчиков, рекомендуем отключать эту опцию в реальных системах. Естественно, что опция может устанавливаться только в файле php.ini — то есть до запуска самого ядра РНР.
log_errors = [Off/On] — позволяет включить запись всех ошибочных сообщений в лог-файл. Последующие директивы конкретизируют особенности работы механизма лога, например путь к файлу, размер лог-файла и другие параметры. Если вы разрабатываете серьезное приложение, особенно в первый период реальной работы, ведение лога и его регулярный просмотр могут стать отличным источником сообщений про недоработки, в то же время пользователям (и, возможно, взломщикам) не будет раскрываться какая-либо информация о внутренней архитектуре приложения.
error_log = [none/путь к лог-файлу] — задает путь к лог-файлу, в который будут записываться сообщения про ошибки и другая отладочная информация. Файл должен располагаться на сервере (не на удаленном компьютере) и быть доступным для записи.
arg_separator.output = [«&»/»другой символ или набор»] — позволяет задать набор символов-разделителей, которые используются в кодировке НТТР-запросов. К примеру, стандартно разделителем переменных является символ амперсанда (&). Можно задать набор из нескольких разделителей, при этом РНР рассматривает каждый из них как вероятный разделитель — если не удалось использовать первый заданный символ, РНР попробует другие. Разделители задаются в виде их кодов.
arg_separator.input = [«;&»/»другой символ или набор»] — аналогично предыдущей опции указывает на символ-разграничитель полей при генерации ссылок средствами РНР.
variables_order = [«EGPCS»] — указывает РНР, где и в каком порядке искать переменные. Буквы обозначают место, где РНР ищет соответствующую переменную — E (переменные окружения), G (содержимое GET-запроса), Р (содержимое POST-запроса), С (переменные Cookie) и S (системные переменные). Поиск происходит в порядке слева направо и в таком же приоритете. То есть при налии переменных с одинаковыми именами РНР возьмет ту, которая встретится первой, — в данном случае переменная окружения (E) будет иметь более высокий приоритет, чем переменная, переданная в HTTP-запросе.
register_globals = [On/Off] — разрешает автоматически представлять все переменные, переданные в HTTP-запросе GET/POST, как обычные глобальные переменные, для обращения к которым не требуется явно указывать, к примеру $HTTP_POST_VARS[] или $_REQUEST[]. В принципе это существенно облегчает программирование, но многие авторы рекомендуют по соображениям безопасности отключать эту директиву и самостоятельно проводить обработку всех данных, поступающих в программу.
post_max_size = [8M/любое целое число M/K] — задает максимальный размер данных, передаваемых через POST-запрос. Эту директиву можно установить только через файлы php.ini и httpd.conf.
magic_quotes_gpc = [On/Off] — активизирует автоматическую обработку символов кавычек. Поскольку эти символы используются в качестве одной из конструкций языка и являются служебными, то РНР может автоматически замещать их на специальную последовательность \’ для безопасной обработки. Эта директива применяется для обработки пользовательских данных, полученных через GET/POST/Cookie.
magic_quotes_runtime = [Off/On] — аналогична предыдущей директиве, с тем отличие
м, что ее действие распространяется на переменные, полученные в результате работы скрипта, например данные от базы данных. По умолчанию директива отключена, и программист должен сам обрабатывать свои данные.
default_mimetype = [«text/html»/допустимый MIME-type] — по умолчанию РНР-скрипт отдает пользователю информацию в виде обычного текста (соответствующий MIME-тип этих данных — text/html). Но если вы пишете специфическую программу, то может потребоваться изменить это значение на нужный вам тип данных. Или, если необходимо указать, что скрипт вернет другие данные, к примеру поток двоичных данных или аудиопоток, эту переменную можно изменить через функцию ini_set().
default_charset = [«iso-8859-1″/допустимая кодировка] — изначально эта директива отключена. Через нее задается кодировка, в которой РНР-скрипт отсылает данные пользователю.
file_uploads = [On/Off] — разрешает принимать файлы от пользователей, переданные через HTML-формы.
upload_tmp_dir =[none/путь к директории] — если прием файлов разрешен, то РНР автоматически обрабатывает их и сохраняет во временной директории. Если директива upload_tmp_dir не задана (а изначально она отключена), то РНР использует системную временную директорию для хранения загружаемых файлов. В скрипте необходимо вручную обрабатывать такие файлы, к примеру через функцию move_uploaded_file().
upload_max_filesize = [2M/целое число M/K] — задает максимальный размер файла, который разрешается передать в скрипт. Кстати, поскольку файл передается в теле POST-запроса, то на его размер влияет и другая директива, post_max_size, поэтому желательно, чтобы допустимый размер файла был меньше общего размера POST-данных. Например, если вы хотите разрешить загрузку нескольких файлов одновременно, то необходимо, чтобы суммарный их обьем был меньше, чем post_max_size, а размер каждого в отдельности не превышал upload_max_filesize.
allow_url_fopen = [On/Off] — разрешает применять обычные функции для работы с файлами при взаимодействии с удаленными узлами. Это позволяет получить тело страницы, просто открыв ее как обычный файл, указав вместо пути полный URL-адрес. Хотя, если честно, предпочтительней использовать для этого соединение через сокеты — у вас будет больше контроля и возможностей при работе с удаленными узлами. Есть еще две директивы, по умолчанию отключенные, from и user_agent, которые задают параметры для доступа (поле from может содержать e-mail пользователя), а через user_agent можно «замаскироваться» под браузер или же честно указать, что это РНР-скрипт (user_agent = «PHP»).
default_socket_timeout = [60/целое число] — задает время ожидания данных из сокета до разрыва соединения.
include_path = [«.;/usr/local/php5/PEAR»] — содержит набор путей для поиска модулей и классов РНР. Если вы используете расширение РЕАR, то укажите путь к каталогу через точку с запятой. Первым по умолчанию указан текущий каталог скрипта. Директива может устанавливаться и программно, но желательно сначала получить ее текущее значение — функция ini_get(‘include_path’) — и просто добавить нужный каталог в список через вызов ini_set().
extension_dir = [«/usr/local/php5/ext»] — задает путь до каталога с модулями расширения. В старых версиях РНР этот каталог носил название extensions, в новых он сократился до простого ext, хотя вы можете располагать модули в любом каталоге. В РНР для платформы win32 расширения — это обычные библиотеки DLL, для платформ Linux/Unix — файлы с расширением *.so.
enable_dl = [On/Off] — разрешает загрузку и использование динамических модулей.
extension = [php_curl.dll/файл модуля] — этой директивой указывается, какой модуль РНР может загружать. Это единственная из всех директив, которая может использоваться несколько раз. При каждом вызове она должна содержать имя файла (вместе с расширением), который содержит необходимый модуль. Обратите внимание, что задаются только имена файлов, а директория, где РНР ищет их, определяется директивой extension_dir. Традиционно все модули имеют название, состоящее из префикса php_ и названия модуля. Например, имя модуля mcrypt, который позволяет использовать функции криптографии в скриптах, будет иметь вид php_mcrypt.dll (на win32) или php_mcrypt.so (на Linux/Unix).
Для загрузки одновременно нескольких модулей просто укажите загрузку каждого модуля в отдельной строке:
В этом примере сначала загружается модуль GD (библиотека для работы с графикой), потом РНР определяет, что директива загрузки модуля mbsring закомментирована (отключена), и переходит к загрузке следующего модуля — mcrypt.
РНР начинает
работу с модулями еще на этапе инициализации, проверяя доступность всех подлежащих загрузке файлов, поэтому все директивы, относящиеся к модулям, могут быть установлены только через файлы http.conf и php.ini. Если какой-либо модуль не найден, то РНР сгенерирует ошибку, но продолжит работу, так как модули не влияют на основную функциональность. Рекомендуется без необходимости не подключать лишние расширения — в некоторых случаях это может лишь замедлить работу и повлиять на общую безопасноть сервера.
И в заключение еще несколько директив, связанных с безопасностью.
expose_php = [On/Off] — со стороны может показатся, что это невинная опция, разрешающая РНР выводить информацию о своей версии в строке HTTP-ответа сервера. Разработчики советовали оставлять ее включенной, так как это может способствовать распространению РНР, ведь на основе анализа ответов серверов собирается, к примеру, мировая статистика использования РНР. Но в то же время это дает бесценную информацию для потенциального взломщика — ведь, имея точную информацию о версии и номере ПО, установленном на сервере, гораздо легче подобрать метод взлома. Поэтому можно рекомендовать отключать эту директиву на рабочих серверах, особенно если вы используете серьезные приложения на стороне сервера.
doc_root = [none/путь к каталогу] — может задавать каталог, в котором размещаются PHP-скрипты. Эта директива разрешает исполнение скриптов только в указанном каталоге и его поддиректориях, запрещая исполнение всех других сценариев. Если вы строите максимально защищенную веб-систему, то вам очень пригодится использование возможностей этой директивы. По умолчанию она отключена.
Вот мы и рассмотрели некоторые основные директивы из общей секции файла конфигурации php.ini. Некоторые модули используют свои собственнеы секции для хранения конфигурации, и мы рассмотрим их в следующих статьях.