Как получать полезные сообщения об ошибках в PHP? (Вместо пустого белого экрана)
Почему вы видите белый экран?
Пустой белый экран (White Screen of Death) — классическая проблема начинающих PHP-разработчиков. Она возникает, когда:
- Включен
display_errors = Off(по умолчанию в production) - Произошла фатальная ошибка (синтаксическая ошибка, вызов несуществующей функции и т.д.)
- Сработал
try/catchбез вывода сообщения
PHP умеет показывать ошибки, но их нужно правильно включить. Сделать это можно тремя способами.
Способ 1: Включение ошибок прямо в скрипте (рекомендую для начала)
Добавьте эти строки в самый ВЕРХ вашего PHP-файла (до любого другого кода):
<?php
// Включаем показ ВСЕХ ошибок
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
// Ваш код
$data = ['name' => 'Иван'];
echo $data['city']; // Теперь вы увидите Warning: Undefined array key
?>
Объяснение параметров:
error_reporting(E_ALL)— сообщать обо всех типах ошибок (включая E_NOTICE, E_WARNING, E_DEPRECATED)ini_set('display_errors', 1)— выводить ошибки на экранini_set('display_startup_errors', 1)— показывать ошибки, возникшие при запуске PHP (например, ошибки в php.ini)
Способ 2: Настройка в php.ini (постоянное решение)
Найдите файл php.ini (обычно в папке PHP или через phpinfo()) и измените:
; Было (закомментировано или Off):
; display_errors = Off
; error_reporting = E_ALL & ~E_DEPRECATED
; Стало:
display_errors = On
error_reporting = E_ALL
; Также убедитесь, что:
display_startup_errors = On
После изменений перезапустите веб-сервер (Apache, Nginx).
Способ 3: Через .htaccess (для Apache)
Если у вас нет доступа к php.ini, добавьте в .htaccess в корне сайта:
php_flag display_errors on
php_value error_reporting 32767
php_flag display_startup_errors on
Число 32767 — это значение E_ALL для PHP 8.x.
Как отлавливать фатальные ошибки?
Синтаксические ошибки в самом файле не покажутся, если вы включили настройки в этом же файле (скрипт не выполнится). Для таких случаев:
- Проверяйте синтаксис через консоль:
php -l ваш_файл.php - Включите
display_startup_errors— это поможет - Используйте современную IDE (PhpStorm, VS Code) — они подсвечивают синтаксические ошибки
Дополнительные советы
- Для разработки всегда используйте
error_reporting(E_ALL)— видите все, даже мелкие предупреждения - Для продакшена обязательно выключите
display_errors(это угроза безопасности), а ошибки пишите в лог:ini_set('log_errors', 1) - Используйте функцию
var_dump()иprint_r()для отладки переменных - Установите
error_reporting(~E_WARNING)если вас раздражают предупреждения о несуществующих ключах, но лучше их видеть и исправлять код
После этих настроек вы начнете видеть понятные сообщения вроде:
Warning: Undefined array key "city" in /var/www/index.php on line 5
Fatal error: Uncaught Error: Call to undefined function foo() in /var/www/test.php:3
Это намного лучше, чем белый экран!
<<Альтернативный подход: создание своего обработчика ошибок
Если вы хотите не просто показывать ошибки, но и форматировать их красиво, логировать или отправлять себе на email — создайте пользовательский обработчик:
<?php
// Включаем показ всех ошибок
error_reporting(E_ALL);
ini_set('display_errors', 0); // Не выводим на экран
ini_set('log_errors', 1); // Пишем в лог
// Свой обработчик
set_error_handler(function($severity, $message, $file, $line) {
// Показываем в браузере красиво
echo "<div style='background:#fdd; padding:10px; border:1px solid red;'>";
echo "<b>Ошибка:</b> $message<br>";
echo "<b>Файл:</b> $file, строка $line<br>";
echo "</div>";
// Пишем в лог
error_log("PHP Error [$severity]: $message in $file on line $line");
});
// Теперь ошибки будут выглядеть стильно
echo $undefined_var;
?>
Для фатальных ошибок (которые не проходят через set_error_handler) используйте register_shutdown_function:
register_shutdown_function(function() {
$error = error_get_last();
if ($error && $error['type'] === E_ERROR) {
echo "Фатальная ошибка: {$error['message']} в {$error['file']} на строке {$error['line']}";
}
});
Этот подход даёт полный контроль над отображением ошибок и особенно полезен при разработке собственных фреймворков или CMS.