Отображение всех ошибок PHP (E_ALL): способы и рекомендации
Основной способ временного включения всех ошибок
Наиболее эффективное решение для быстрой диагностики
В большинстве случаев требуется временно увидеть все ошибки, предупреждения и уведомления PHP без изменения глобальных файлов сервера. Для этого используются функции ini_set() и error_reporting(), которые применяются в начале скрипта.
<?php
// Включить отображение ошибок на экране
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1); // Ошибки при запуске PHP
// Остальной код
?>
Php скрипт выполняется (статус выполнения php скрипта)
Пояснение шагов:
- error_reporting(E_ALL) – устанавливает уровень отчетности всех типов ошибок, включая будущие уровни (используйте E_ALL | E_STRICT для полного контроля).
- ini_set('display_errors', 1) – разрешает вывод ошибок в stdout (браузер).
- display_startup_errors – включает ошибки, возникающие на этапе инициализации PHP (например, при подключении расширений).
Возможные проблемы:
- Функция ini_set() не сработает, если в php.ini установлено display_errors = Off и эта директива помечена как PHP_INI_SYSTEM (не меняется во время выполнения). В таком случае придется изменять php.ini или .htaccess.
- После отладки необходимо отключить вывод ошибок на рабочем сервере для безопасности.
Варианты настройки в зависимости от окружения
Как сделать, чтобы ошибки PHP отображались глобально для всего сервера через php.ini?
Этот способ подходит для разработки на локальном сервере или в среде, где доступен основной файл конфигурации PHP. Изменения в php.ini действуют постоянно.
; Пример строк в php.ini
display_errors = On
error_reporting = E_ALL
display_startup_errors = On
Php error reporting e all (настройка отображения всех ошибок php (e_all))
Пояснение:
- После изменения перезапустите веб-сервер (Apache, Nginx, PHP-FPM).
- Для проверки текущих настроек можно создать файл с <?php phpinfo(); ?>.
Типичные ошибки:
- Если php.ini не найден или используется отдельный конфиг для пула (например, в PHP-FPM), изменения не вступят в силу. Проверяйте через phpinfo(), какой файл загружен.
- На production-сервере включенный display_errors может раскрыть критическую информацию.
Как включить E_ALL через .htaccess для конкретного сайта на Apache?
Решение подходит, если используется веб-сервер Apache с модулем mod_php или mod_suexec и есть доступ к файлу .htaccess в корне сайта.
# В файле .htaccess
php_value error_reporting E_ALL
php_flag display_errors On
php_flag display_startup_errors On
Info php start (информация о php)
Пояснение:
- Директивы применяются для текущего каталога и всех подкаталогов, если не переопределены.
- Проверьте, что модуль mod_rewrite включен и AllowOverride не запрещает использование php_value.
Проблемы:
- На некоторых хостингах использование php_value может быть запрещено. Вместо этого применяют .user.ini.
- Если используется PHP-FPM (через mod_proxy_fcgi), .htaccess не обрабатывается - нужны настройки пула.
Как настроить отображение ошибок в пуле PHP-FPM для Nginx?
При связке Nginx + PHP-FPM настройки директив PHP задаются в файлах пула (обычно /etc/php/*/fpm/pool.d/*.conf) или через .user.ini. Рекомендуется редактировать конфигурацию пула.
; В файле пула (например, /etc/php/8.3/fpm/pool.d/www.conf)
php_admin_flag[display_errors] = On
php_admin_value[error_reporting] = E_ALL
php_admin_flag[display_startup_errors] = On
Пояснение:
- После изменения перезапустите PHP-FPM. php_admin_flag использует строгие права, поэтому скрипты не смогут переопределить эти значения через ini_set().
- Для временного изменения можно добавить аналогичные строки в .user.ini в корне сайта (без префикса php_admin_).
Типичные ошибки:
- Директивы php_admin_* нельзя переопределить в коде, что может быть неудобно для отдельных скриптов.
- Не забудьте перезагрузить PHP-FPM после изменений.
Как применить E_ALL для отдельных каталогов через .user.ini?
.user.ini – это файл, который PHP автоматически ищет в директории скрипта и выше. Он полезен, когда нет доступа к основному php.ini или нужно изменить настройки только для части сайта.
; В файле .user.ini (в каталоге, где нужно включить ошибки)
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
Пояснение:
- Файл читается при каждом запросе, изменения вступают в силу сразу, без перезапуска сервера.
- Не рекомендуется использовать на production из-за возможного падения производительности (проверка файла при каждом запросе).
Проблемы:
- Если в php.ini установлена директива user_ini.filename (по умолчанию .user.ini), то файл будет обрабатываться. Убедитесь, что он не пуст и не содержит синтаксических ошибок.
- При использовании опкэша (OPcache) изменения в .user.ini применяются для всех скриптов, но может потребоваться очистка кэша.
Что делать, если ни один из методов не работает?
Проверьте, не переопределяют ли настройки в каком-либо из конфигурационных файлов (например, php.ini в другой директории). Также убедитесь, что функция error_reporting() вызывается до любых операций, которые могут вызвать ошибку. Для CLI-скриптов убедитесь, что выбрана соответствующая конфигурация (php -i покажет used command line ini file).
<?php
// Быстрая проверка текущих настроек
var_dump(ini_get('display_errors'));
var_dump(ini_get('error_reporting'));
?>
Частая ошибка:
Забывают указать display_startup_errors, из-за чего синтаксические ошибки в файле, вызванном через include, не отображаются.
Расширенные примеры и нестандартные приёмы
Использование error_reporting(-1) для захвата всех будущих уровней
Константа E_ALL может не включать новые типы ошибок, добавленные в свежих версиях PHP (например, E_DEPRECATED). Значение -1 означает «все возможные уровни, включая те, что появятся в будущем».
<?php
error_reporting(-1);
ini_set('display_errors', 1);
?>
Результат: отображаются все ошибки, включая те, которые не входят в состав E_ALL на текущей версии PHP.
Проверка текущей конфигурации через phpinfo()
Функция phpinfo() выводит полную информацию о настройках PHP, включая расположение загруженного php.ini и текущие значения error_reporting, display_errors.
<?php phpinfo(); ?>
Результат: таблица с разделом PHP Core, где видны фактические значения директив. Это полезно для диагностики, почему изменения не вступают в силу.
Перенаправление ошибок в лог-файл при одновременном отображении
Можно настроить запись ошибок в отдельный файл, даже если вывод на экран включён. Это помогает сохранить историю ошибок.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('log_errors', 1);
ini_set('error_log', '/path/to/php-errors.log');
?>
(вывод ошибок в браузере и параллельная запись в указанный файл)
Использование set_error_handler() для кастомного вывода с контекстом
Когда стандартный вывод недостаточен, можно перехватывать ошибки и выводить их с дополнительной информацией (дамп переменных, стек вызовов).
<?php
function customErrorHandler($severity, $message, $file, $line) {
echo "<b>Ошибка уровня $severity:</b> $message в файле $file на строке $line<br>";
echo "<pre>"; debug_print_backtrace(); echo "</pre>";
}
set_error_handler('customErrorHandler', E_ALL);
// Пример вызова неопределенной функции
trigger_error('Тестовая ошибка', E_USER_WARNING);
?>
Ошибка уровня 512: Тестовая ошибка в файле /var/www/index.php на строке 10#0 ...
Отображение ошибок в CLI-скриптах (командная строка)
В консольных скриптах по умолчанию вывод ошибок часто отключён. Для включения используйте те же функции, но учтите, что настройки php.ini для CLI могут быть отдельными.
$ php -d error_reporting=E_ALL -d display_errors=1 -d display_startup_errors=1 script.php
Результат: все ошибки выводятся в терминал. Также можно использовать -r для однострочников:
$ php -d error_reporting=-1 -r 'echo $undefined;'
Warning: Undefined variable $undefined in Command line code on line 1
Применение ini_get() для выборочного тестирования настроек
Перед включением отображения убедитесь, что текущие настройки позволяют это сделать. Пример проверки перед изменением:
<?php
if (ini_get('display_errors') == 0) {
echo 'Сейчас ошибки скрыты. Включаем...';
ini_set('display_errors', 1);
error_reporting(E_ALL);
}
?>
Результат: сообщение только при необходимости включения.
Скрытие ошибок на production с помощью условной логики
Рекомендуется оставлять display_errors отключённым на живых серверах. Включать отображение можно только при определённых условиях (например, по IP-адресу разработчика).
<?php
if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] === '192.168.1.100') {
error_reporting(E_ALL);
ini_set('display_errors', 1);
} else {
error_reporting(0);
ini_set('display_errors', 0);
}
?>
(только для разработчика ошибки видны; для остальных пользователей ошибки скрыты)