Настройка PHP: вывод ошибок для разработки

Раздел: PHP -> Настройка вывода ошибок PHP

Основные методы включения вывода ошибок

Как включить отображение всех ошибок непосредственно в коде PHP?

Для включения вывода всех ошибок во время выполнения скрипта используются две функции: error_reporting(E_ALL) и ini_set('display_errors', 1). Первая задаёт уровень ошибок, которые нужно собирать, вторая включает их отображение на экране.

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Пример с неопределённой переменной
echo $undefined;

// Пример с делением на ноль
$result = 10 / 0;
?>

После выполнения этого скрипта появятся соответствующие уведомления и предупреждения.

Типичные проблемы:

  • Функция ini_set может быть запрещена в файле php.ini (директива disable_functions). В этом случае нужно менять конфигурацию на уровне сервера.
  • Директива display_errors может быть переопределена в php.ini более высоким приоритетом. Рекомендуется устанавливать её в начале скрипта.
  • Ошибки, возникающие до выполнения этих строк (например, синтаксические), не будут отображены. Для их отображения требуется включить display_startup_errors.

Как настроить вывод ошибок через главный конфигурационный файл php.ini?

Изменение php.ini позволяет задать глобальные настройки для всех скриптов на сервере. Для включения вывода ошибок необходимо найти в файле директивы display_errors = On и error_reporting = E_ALL (или E_ALL & ~E_DEPRECATED), затем перезапустить веб-сервер.

; php.ini
display_errors = On
error_reporting = E_ALL

После перезапуска сервера все скрипты начнут показывать ошибки.

Возможные сложности:

  • На некоторых хостингах доступ к php.ini отсутствует; тогда используют .htaccess или .user.ini.
  • Изменения применяются ко всем сайтам, что может быть нежелательно для продакшена.
  • Для вступления в силу изменений требуется перезагрузка сервера или FastCGI-пула.

Как включить отображение ошибок через файл .htaccess на Apache?

Если веб-сервер Apache с модулем mod_php или mod_ruid2, можно задать директивы в файле .htaccess в корневой папке сайта. Это работает только для текущей директории и не требует доступа к основному php.ini.

# .htaccess
php_flag display_errors on
php_value error_reporting 32767

Число 32767 соответствует значению E_ALL (все ошибки). Для PHP 8.0+ можно использовать E_ALL (числовое значение может отличаться).

Проблемы при использовании:

  • Директивы с php_flag / php_value доступны только при настройке AllowOverride Options в конфигурации Apache.
  • Не все хостинги разрешают такие настройки; иногда блокируются через директиву AllowOverride None.
  • При использовании PHP-FPM директивы .htaccess не применяются; нужен .user.ini.

Как задать директивы ошибок для конкретной директории с помощью .user.ini?

Для PHP-FPM или CGI/FastCGI поддерживаются файлы .user.ini. Они работают аналогично php.ini, но применяются только к текущей папке и её подпапкам. Создайте файл .user.ini в нужной директории и укажите настройки.

; .user.ini
display_errors = On
error_reporting = E_ALL

Файл считывается при каждом запросе; изменения вступают в силу сразу без перезапуска сервера.

Ограничения:

  • Поддерживается не всеми SAPI (не работает с mod_php).
  • Директивы могут переопределяться php.ini более высокого уровня.
  • Файл должен быть доступен для чтения веб-серверу.

Как включить вывод ошибок в консольном режиме PHP?

При запуске скриптов из командной строки вывод ошибок по умолчанию отключён. Для включения используйте аргументы -d при запуске или задайте настройки в скрипте.

php -d display_errors=1 -d error_reporting=E_ALL script.php

Также можно установить переменные окружения PHP_INI_SCAN_DIR или отредактировать файл php.ini для CLI (обычно /etc/php/8.x/cli/php.ini).

Особенности:

  • В CLI режиме display_errors по умолчанию равен stderr; для отправки в stdout нужно задать явно.
  • Аргументы -d применяются только к текущему запуску.
  • Некоторые хостинг-панели могут блокировать передачу аргументов через оболочку.

Как ограничить отображение только определённых типов ошибок?

Вместо E_ALL можно указать комбинацию флагов, чтобы показывать только, например, фатальные ошибки или предупреждения. Это полезно для фильтрации шума во время разработки.

<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
ini_set('display_errors', 1);
?>

Такой код покажет только ошибки типов Error, Warning и Parse, игнорируя Notice и Strict.

Риски:

  • Слишком узкая фильтрация может скрыть важные уведомления, которые указывают на потенциальные баги.
  • Разные версии PHP используют разные константы (E_STRICT добавлен в 5.0, E_DEPRECATED в 5.3).
  • Некорректная битовая маска может привести к непредсказуемому поведению.

Дополнительные примеры настройки вывода ошибок

Пример 1. Включение отображения ошибок вместе с логгированием

Иногда требуется одновременно показывать ошибки на экране и записывать их в файл. Для этого используются директивы display_errors и error_log.

Пример
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('log_errors', 1);
ini_set('error_log', '/var/log/php_errors.log');

// Искусственная ошибка
trigger_error('Тестовое сообщение', E_USER_WARNING);
?>
Warning: Тестовое сообщение in /var/www/test.php on line 7

После выполнения скрипта ошибка отобразится в браузере, а также будет записана в указанный лог-файл.

Возможные проблемы:

  • Необходимо убедиться, что файл лога доступен для записи веб-сервером.
  • Если error_log не указан, PHP использует системный лог (syslog) или файл по умолчанию.

Пример 2. Использование error_reporting с побитовыми операциями

Можно комбинировать флаги, исключая определённые типы ошибок. Например, отключить уведомления, но оставить все остальные.

Пример
<?php
error_reporting(E_ALL & ~E_NOTICE);
ini_set('display_errors', 1);

echo $undefinedVar; // Notice не будет показан
echo 10 / 0;        // Warning будет показан
?>
Warning: Division by zero in /var/www/test.php on line 5

Уведомление о неопределённой переменной подавлено, а предупреждение о делении на ноль отображается.

Пример 3. Включение ошибок для конкретного запроса через заголовки

В некоторых сценариях (например, AJAX) удобно передавать настройки через HTTP-заголовки, но это нестандартное решение. Обычно используется куки или сессия, но для демонстрации показан альтернативный подход.

Пример
<?php
if (isset($_SERVER['HTTP_X_DEBUG']) && $_SERVER['HTTP_X_DEBUG'] === 'true') {
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
}
// дальнейший код
?>

При отправке запроса с заголовком X-Debug: true ошибки будут показаны. Данный метод полезен для отладки в изолированных тестах.

Предостережения:

  • Небезопасно использовать в production, так как любой может добавить заголовок.
  • Требует дополнительной логики и не поддерживается стандартными средствами PHP.

Пример 4. Настройка через php.ini для CLI с раздельными конфигурациями

Для консольных скриптов часто используют отдельный файл php.ini. Пример команд для быстрой проверки настроек.

Пример
$ php -i | grep display_errors
display_errors => STDOUT => STDOUT

Если значение STDOUT, ошибки выводятся в консоль. Для включения можно создать файл `~/.config/php/cli.ini`:

Пример
display_errors = On
error_reporting = E_ALL

Затем запустить скрипт с указанием этого файла:

Пример
php -c ~/.config/php/cli.ini script.php

Результат выполнения скрипта с неопределённой переменной:

PHP Notice:  Undefined variable: foo in /home/user/script.php on line 3
- вывод ошибок php (вывод ошибок php)
- включить ошибки php (включение вывода ошибок php)

Включение вывода ошибок PHP - comments

En
включить ошибки php (php)