PHP error reporting - как настроить вывод ошибок и предупреждений

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

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

Использование ini-файла

Один из самых простых способов настройки вывода ошибок и предупреждений в PHP - это использование ini-файла. В нем можно указать значения для директив display_errors и display_startup_errors. Они определяют, будут ли ошибки отображаться пользователю или нет. Также в ini-файле задается директива error_reporting, отвечающая за то, какие конкретно ошибки и предупреждения будут выводиться.

  • Директива display_errors обычно выключена на рабочих сайтах, чтобы скрыть ошибки от пользователей.
  • А display_startup_errors нужна для отображения ошибок инициализации PHP, на которые не влияет display_errors.

Также в ini-файле можно настроить параметры записи ошибок в лог. Это позволяет скрывать ошибки от пользователей, но при этом фиксировать их для дальнейшего анализа и исправления разработчиком.

Файл конфигурации PHP обычно называется php.ini и располагается в каталоге с установленным PHP.

Файл php.ini с настройками ошибок

Настройка в .htaccess

Файл .htaccess позволяет настроить поведение сервера Apache непосредственно для конкретного сайта или каталога. Это удобно, когда нет доступа к основной конфигурации сервера или ini-файлу PHP.

В .htaccess можно задать значения для директив display_errors и display_startup_errors, чтобы включить или отключить вывод ошибок PHP. Также поддерживается директива error_reporting для фильтрации конкретных типов ошибок и предупреждений.

Кроме того, используя .htaccess можно настроить запись ошибок и предупреждений в custom лог-файл. Для этого служит директива php_flag log_errors. В качестве пути к логу можно указать относительный путь к каталогу сайта или абсолютный.

  • Преимущество настройки логирования в .htaccess в том, что не нужны права на запись в системные логи сервера.
  • Но есть и недостаток - на производительность может повлиять запись в файл на диск при каждой ошибке.

Функции и триггеры

Помимо настроек на уровне ini-файла или .htaccess, в PHP есть функции для управления выводом ошибок и предупреждений во время выполнения скрипта.

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

  • С помощью констант E_ERROR, E_WARNING и т.д. можно точно указать типы сообщений.
  • А используя побитовые операторы & (И), | (ИЛИ), ~ (НЕ) добиться нужной комбинации.

Еще одна полезная функция - trigger_error(). Она позволяет генерировать сообщения об ошибках и предупреждениях программно, в нужных местах кода:

trigger_error('Ошибка при подключении к БД!', E_USER_ERROR);

Такие сообщения можно использовать для отладки, логирования или вместо исключений в старом коде. Уровень сообщения определяет, как с ним будет обращаться PHP.

Фрагмент кода с функциями обработки ошибок

Рекомендации для production сайта

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

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

Поэтому на рабочем сайте рекомендуется:

  • Выключить директивы display_errors и display_startup_errors в php.ini или .htaccess;
  • Оставить только критические ошибки в error_reporting - E_ERROR или E_ALL & ~E_NOTICE & ~E_WARNING;
  • Настроить логирование ошибок и предупреждений в отдельный файл для анализа.

Такой подход позволит скрыть неполадки от посетителей, но при этом оперативно получать информацию для решения проблем и повышения стабильности сайта.

Статья закончилась. Вопросы остались?
Комментарии 0
Подписаться
Я хочу получать
Правила публикации
Редактирование комментария возможно в течении пяти минут после его создания, либо до момента появления ответа на данный комментарий.