Отображение всех ошибок PHP (E_ALL): способы и рекомендации

Раздел: PHP -> Диагностика

Основной способ временного включения всех ошибок

Наиболее эффективное решение для быстрой диагностики

В большинстве случаев требуется временно увидеть все ошибки, предупреждения и уведомления 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);
}
?>
(только для разработчика ошибки видны; для остальных пользователей ошибки скрыты)

Настройка отображения всех ошибок PHP (E_ALL) - comments

En
Php error reporting e all (php)