Статьи

Тур по PHP.INI

Любой, у кого есть сервер, использующий PHP, несомненно, слышал о php.ini — это файл конфигурации, используемый для контроля и настройки поведения PHP во время выполнения. Он предоставляет простой способ настройки параметров для таких вещей, как:

  • Загрузить каталоги
  • Ошибки журнала
  • Максимальное время выполнения скрипта
  • Предел загрузки файлов

… и многое другое.

php.ini — это первый файл, который ищет PHP при запуске из-за важности директив конфигурации, которые он устанавливает. Однако, если вы внесете изменения в свой php.ini , потребуется перезагрузка сервера, чтобы изменения вступили в силу.

php.ini файл php.ini с рекомендуемыми настройками поставляется с PHP. Многие хостинг-провайдеры, поддерживающие PHP, позволяют вам настраивать директивы php.ini чтобы вы могли настроить поведение PHP так, как вам нравится. В этих случаях PHP использует только значения для директив, которые вы указали в своем файле php.ini ; любым настройкам, которые вы не объявляете в своем файле, присваиваются соответствующие значения из исходного php.ini и встроенных в PHP настроек по умолчанию.

В этой статье я расскажу о некоторых важных настройках, которые, на мой взгляд, должны быть вам интересны при настройке вашего собственного файла php.ini . Конечно, это всего лишь личный выбор, и каждый со временем будет разрабатывать свои предпочтения, поэтому я рекомендую вам провести тщательное исследование множества директив конфигурации, доступных в php.ini .

Расположение php.ini зависит от сервера и способа установки PHP. Для целей этой статьи я предполагаю, что это на /usr/local/lib/php/php.ini . Ваш путь может быть другим. Чтобы узнать, где находится ваш файл php.ini , вы можете использовать phpinfo() .

Итак, давайте начнем наш тур по файлу php.ini , первая остановка: директива engine .

PHP Engine

  двигатель = вкл 

Первым параметром конфигурации является директива engine , которая в основном контролирует, включен ли механизм PHP. Эта директива отвечает за определение того, доступен ли PHP для ваших сценариев, а установка на Off отключит вас от использования PHP вообще.

Вы можете удивиться, почему я включил это, поскольку очевидно, что вы должны оставить это включенным, если вы планируете использовать PHP. Простой ответ заключается в том, что наличие этого в пользовательском файле php.ini позволяет вам полностью контролировать PHP-сервер в рамках вашей пользовательской конфигурации. Вы будете устанавливать все свои пользовательские правила для PHP в этом файле, и я считаю, что неэффективно скрывать главный переключатель в другом файле, а не представлять его в файле, который вы будете посещать чаще всего.

Следующая остановка — директива, которую я считаю наиболее важной в написании переносимого кода: short_open_tag .

Короткие метки

  short_open_tag = Вкл 

Директива short_open_tag позволяет разработчикам использовать короткие теги, которые в двух словах — это когда разработчик пишет <? вместо <?php . Пример использования коротких тегов:

 <? echo "Hello World"; ?> 

по сравнению с использованием полных тегов:

 <?php echo "Hello World"; ?> 

С включенным short_open_tag вы можете использовать оба <? и <?php . Однако использование коротких тегов имеет очень большие недостатки, особенно когда вы разрабатываете все, что предназначено для использования на различных PHP-серверах. Короткие теги включены по умолчанию, но могут вызвать проблемы с анализом, поэтому некоторые люди отключают эту опцию. Если ваш код зависит от коротких тегов, он не будет работать на их сервере. Настоятельно рекомендуется отключать короткие теги в своем php.ini при разработке переносимого кода, чтобы вы сами не могли их использовать.

Далее я выделю опцию, с которой каждый на любом уровне развития будет иметь дело, даже не подозревая об этом: буферизация вывода.

Буферизация вывода

  output_buffering = Off 

Возможно, вы несколько раз видели производную от следующего сообщения: Невозможно добавить уже отправленные заголовки информации заголовка. Это предупреждение появляется, когда сценарий пытается установить заголовок HTTP (элемент, не видимый пользователем, но, тем не менее, обработанный веб-браузером) после того, как он уже начал отправлять выходные данные обратно в браузер пользователя. Включение output_buffering приводит к тому, что PHP задерживает отправку заголовков, и вместо этого отправляет их и вывод из вашего скрипта одновременно, как только скрипт завершит обработку. Это позволяет вам изменять значения заголовка в любой момент во время выполнения вашего скрипта.

Обычно считается, что output_buffering — это директива, которую можно оставить output_buffering не вызывая при этом каких-либо серьезных осложнений, поэтому может быть полезно оставить ее включенной, если когда-либо потребуется ее функциональность. Лично я предпочитаю не включать его, потому что, если вы разрабатываете плагин WordPress, например, который будет работать на многих разных серверах, вам нужно следить за тем, чтобы ваш код не полагался на автоматическую буферизацию вывода для включения.

Далее давайте рассмотрим два варианта, которые могут быть очень полезны, если вы создаете веб-сайт, в котором визуальные шаблоны имеют общие файлы auto_prepend_file и auto_append_file колонтитула: auto_prepend_file и auto_append_file .

Автоматические колонтитулы

  auto_prepend_file = "header.php"
 auto_append_file = "footer.php" 

auto_prepend_file и auto_append_file позволяют указать PHP добавить файл в вывод вашего скрипта и добавить файл в конце. Это напоминает функции get_header() и get_footer() в WordPress и может быть очень полезным, если вы используете общие файлы верхнего и нижнего колонтитула. Однако помните, что файлы, указанные в этих директивах, будут использоваться для каждого файла PHP, что может быть не совсем тем, что вы хотите.

Альтернативное использование для auto_prepend_file и auto_append_file — установить простой таймер выполнения, который можно использовать для auto_prepend_file времени, необходимого для генерации страницы. Например, файл, загруженный auto_prepend_file может содержать:

 <?php $t1 = microtime(true); 

… И файл для auto_append_file будет содержать:

 <?php $t2 = microtime(true); $elapsed = $t2 - $t1; $logFile = "/tmp/timing.txt"; file_put_contents($logFile, $elapsed . " " . $_SERVER["REQUEST_URI"] . "n", FILE_APPEND); 

Следующая остановка в нашем туре — директивы PHP по обработке ошибок.

Обработка ошибок

  error_reporting = E_ALL | E_STRICT
 display_errors = Off
 log_errors = On
 error_log = "/var/log/php_errors.log" 

Параметры, которые я показал выше, являются рекомендуемой конфигурацией для поведения отчетов об ошибках PHP в производственной среде. Ошибка в вашем скрипте может быть нефатальной (например, уведомление или предупреждение) или фатальной, что останавливает выполнение вашего скрипта. Независимо от того, является ли ошибка фатальной или нефатальной, эта конфигурация будет указывать PHP не отображать сообщение об ошибке в его выводе, а вместо этого сохранять его в файле журнала ошибок.

Включение display_errors выведет подробности ошибки в ваш браузер, что удобно для разработки. Но после развертывания вашего сайта сообщения об ошибках могут отвлекать ваших пользователей и даже предоставлять злонамеренным пользователям информацию о том, как атаковать ваш сайт. Лучше отправлять сообщения об ошибках в файл журнала, к которому имеют доступ только вы и другие администраторы. Это можно сделать, установив директиву error_log . Сообщения об ошибках, которые обычно отображаются в браузере, будут записываться в указанный файл.

Для получения дополнительной информации об обработке ошибок, прочитайте статью Снеха Хеда, Обработка ошибок в PHP .

Последняя остановка в нашем туре — краткий обзор часовых поясов в PHP.

Часовые пояса

  date.timezone = "США / Центральный" 

Этот параметр не установлен по умолчанию в php.ini и когда E_STRICT отчетность E_STRICT , PHP будет выдавать предупреждения каждый раз, когда вы используете функцию даты или времени в своем скрипте. Это можно легко решить, установив директиву date.timezone в вашем файле конфигурации.

Разработчики часто игнорируют этот параметр, но при правильной настройке он может снизить вероятность возникновения большого количества осложнений в вашем PHP-сценарии в будущем. Полный список поддерживаемых часовых поясов доступен в онлайн-документации .

Резюме

Настоятельно рекомендуется, чтобы все веб-разработчики просмотрели файл php.ini своего сервера, ознакомились с его содержимым и соответствующим образом персонализировали некоторые директивы. Директивы конфигурации в этой статье должны дать вам хорошее место для начала. Если вы используете общий хост, конфигурация, установленная хостинговой компанией, не всегда может быть лучшей и может не соответствовать вашему стилю кодирования. Узнайте у своего провайдера, какие варианты доступны для настройки вашей среды.

Изображение через Laborant / Shutterstock