Avatar ·

Как получать полезные сообщения об ошибках в PHP? (Вместо пустого белого экрана)

Привет! Я начинающий PHP-разработчик и у меня постоянно возникает одна и та же проблема: когда в коде происходит ошибка, я вижу просто пустой белый экран. Никаких сообщений, никаких подсказок — просто тишина. Это сводит с ума! Например, я пишу простой скрипт: ```php 'Иван', 'age' => 25]; echo $data['name']; echo $data['city']; // Ошибка: ключ не существует ?> ``` Вместо того чтобы увидеть предупреждение о несуществующем ключе, я получаю пустую страницу. Или когда я подключаю файл с синтаксической ошибкой: ```php ``` Опять белый экран. Я уже проверил, что PHP работает — простой `` выводится нормально. Я слышал про `error_reporting` и `display_errors`, но не понимаю, как их правильно настроить. Где их писать? В самом скрипте, в php.ini или в .htaccess? И что означают все эти уровни ошибок (E_ALL, E_WARNING, E_NOTICE)? Мне нужно, чтобы 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.