Предупреждения Deprecated и вывод PHP-ошибок прямо на странице сайта — неприятная находка на боевом проекте: и с точки зрения профессионального впечатления, и с точки зрения безопасности, поскольку трассировка ошибки раскрывает структуру кода и сервера. Разберём, как правильно отключить вывод ошибок для посетителей, не потеряв возможность их видеть при разработке.
Разница между отключением вывода и отключением логирования
Критично не путать две разные вещи: скрытие ошибок от посетителя сайта (вопрос профессионального вида и безопасности) и полное отключение логирования ошибок вовсе (что лишает возможности диагностировать реальные проблемы). Правильная настройка — ошибки не выводятся на экран посетителю, но продолжают записываться в лог-файл для последующего анализа разработчиком.
Настройка через php.ini
; php.ini на боевом сервере
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
display_errors = Off скрывает вывод ошибок
от посетителя, а log_errors = On с указанным путём
сохраняет запись ошибки в файл для последующей проверки —
оба параметра стоит настраивать вместе, а не отключать вывод
без включения логирования, иначе информация об ошибке теряется
полностью, а не просто скрывается от постороннего просмотра.
Нужна помощь с Битрикс?
Настройка на уровне Битрикса
Помимо системных настроек PHP, Битрикс имеет собственный параметр в настройках главного модуля, определяющий, показывать ли отладочную информацию администратору отдельно от обычных посетителей, — авторизованный администратор может видеть дополнительную отладочную информацию (например, SQL-запросы страницы), тогда как обычный посетитель этого не видит вовсе независимо от настроек PHP.
Deprecated-предупреждения при обновлении версии PHP
Массовое появление Deprecated-предупреждений часто совпадает
с обновлением версии PHP на сервере — новая версия языка помечает
устаревшим синтаксис или функции, которые раньше работали
без предупреждений. Скрытие этих предупреждений от посетителя
через error_reporting — временная мера, а не
решение самой проблемы: код, вызывающий Deprecated-предупреждения,
стоит постепенно актуализировать, поскольку в будущих версиях PHP
устаревшая функциональность может быть удалена полностью,
а не просто помечена предупреждением.
Разное поведение на dev и prod окружениях
; локальное окружение разработки
display_errors = On
error_reporting = E_ALL
; боевой сервер
display_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
Настройки вывода ошибок для окружения разработки и боевого сервера должны различаться осознанно — на локальной машине разработчику полезно видеть все ошибки и предупреждения сразу на экране для быстрой отладки, тогда как на проде это недопустимо для посетителя, но должно оставаться доступным через лог для последующего анализа разработчиком.
Обработчик ошибок для критичных сбоев
<?php
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
AddMessage2Log("PHP Error: $errstr in $errfile:$errline", 'php.errors');
return true; // подавить стандартный вывод
});
Для более тонкого контроля над обработкой ошибок вместо простой
настройки display_errors можно зарегистрировать
собственный обработчик, направляющий ошибки в журнал событий
Битрикса вместо стандартного файла лога PHP, — это удобно, когда
вся диагностика проекта уже централизована в одном месте через
штатный журнал системы, а не разбросана по нескольким разным
источникам логов.
Частые ошибки
- Ошибки отключены полностью, без логирования вовсе. Реальные проблемы остаются незамеченными, поскольку информация о них теряется, а не просто скрывается от постороннего просмотра.
- Deprecated-предупреждения просто скрыты, а не устранены в коде. Риск сломанной функциональности при будущем обновлении PHP, когда устаревшая возможность будет удалена полностью.
- Одинаковые настройки вывода ошибок на dev и prod. Либо неудобная отладка локально, либо небезопасный вывод посетителям на боевом сервере.
Итог
Правильная настройка обработки ошибок разделяет две задачи —
скрытие вывода от посетителя через display_errors = Off
и сохранение информации об ошибке через включённое логирование —
а не сводится к простому отключению всего сразу. Deprecated-предупреждения
стоит рассматривать как сигнал для постепенной актуализации кода,
а не только как раздражающий вывод, который достаточно скрыть
и забыть.
