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.
Настройка в .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;
- Настроить логирование ошибок и предупреждений в отдельный файл для анализа.
Такой подход позволит скрыть неполадки от посетителей, но при этом оперативно получать информацию для решения проблем и повышения стабильности сайта.