Avatar ·

Как получать полезные сообщения об ошибках в PHP и не видеть пустую страницу?

Всем привет! Я начинающий PHP-разработчик и пишу небольшой сайт. Постоянно сталкиваюсь с ситуацией, когда код работает не так, как я ожидаю, но вместо сообщения об ошибке я вижу просто пустую белую страницу. Это очень раздражает! Вот пример: ```php ``` Когда я запускаю этот код, то вижу пустую страницу. Никаких сообщений об ошибке. Я понимаю, что проблема в делении на ноль, но PHP молчит. Раньше я работал с JavaScript, где ошибки показываются сразу в консоли браузера, а тут — полная тишина. Я пробовал включать display_errors в php.ini, но это не помогло — видимо, я что-то делаю не так. Ещё слышал про error_reporting, но не понимаю, как это настроить правильно. Может быть, есть какой-то стандартный способ, чтобы видеть все ошибки, предупреждения и уведомления? И как правильно логировать ошибки, чтобы потом их анализировать? Подскажите, как настроить вывод ошибок в PHP, чтобы я мог видеть, что именно пошло не так. Заранее спасибо! <<>>

Проблема пустой страницы и как её решить

Пустая страница — это результат того, что PHP не показывает ошибки (display_errors выключен) или они подавлены (error_reporting = 0). В production-режиме это нормально, но для разработки нужно всё включить.

// Самый быстрый способ — добавить в начало скрипта
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

После этого ваш код с делением на ноль выдаст:

Warning: Division by zero in /path/to/script.php on line 5

Настройка через php.ini (правильный путь)

Откройте php.ini (обычно путь /etc/php/версия/apache2/php.ini или php --ini покажет местоположение) и измените:

display_errors = On
display_startup_errors = On
error_reporting = E_ALL

Вариант для .htaccess (Apache)

php_flag display_errors on
php_value error_reporting -1

Почему стоит использовать E_ALL

E_ALL включает все типы ошибок: фатальные (E_ERROR), предупреждения (E_WARNING), уведомления (E_NOTICE), строгие (E_STRICT) и т.д. Для новичка это идеально — вы увидите даже потенциально опасные места в коде.

Логирование ошибок (чтобы не терять)

Даже с display_errors = On, ошибки можно дублировать в лог-файл:

ini_set('log_errors', 1);
ini_set('error_log', '/var/log/php_errors.log'); // путь к файлу
error_reporting(E_ALL);

Теперь все ошибки будут и на экране, и в файле. Это удобно для отладки.

Обработка через set_error_handler

Для более продвинутого контроля используйте пользовательский обработчик:

function customErrorHandler($errno, $errstr, $errfile, $errline) {
    echo "<b>Ошибка:</b> [$errno] $errstr в файле $errfile на строке $errline\n";
    // Можно логировать в БД или файл
    return true; // Не передавать стандартному обработчику
}

set_error_handler("customErrorHandler");
error_reporting(E_ALL);

Исключения (Exception) — современный подход

Для критических ошибок используйте try-catch:

try {
    $result = divideNumbers(10, 0);
    echo "Результат: " . $result;
} catch (DivisionByZeroError $e) {
    echo "Поймали ошибку: " . $e->getMessage();
}

Но проще начать с display_errors и E_ALL — это покроет 99% случаев.

Проверка ошибок при запуске

Добавьте в начало скрипта:

if (!ini_get('display_errors')) {
    ini_set('display_errors', 1);
}
echo 'Ошибки включены: ' . (ini_get('display_errors') ? 'Да' : 'Нет');

Это поможет убедиться, что настройка применилась.

<<>>

Альтернатива: использование Xdebug для детальной отладки

Если стандартные сообщения об ошибках не дают полной картины (например, вы не видите стек вызовов или значения переменных), установите расширение Xdebug. Оно делает вывод ошибок гораздо информативнее:

  • Показывает цветной стек вызовов с номерами строк
  • Отображает значения переменных в момент ошибки
  • Интегрируется с IDE (PhpStorm, VS Code) для пошаговой отладки

Установка через Composer:

composer require --dev xdebug/xdebug

Или через пакетный менеджер (Ubuntu):

sudo apt install php-xdebug

После установки добавьте в php.ini:

zend_extension=xdebug.so
xdebug.mode=develop,debug
xdebug.start_with_request=yes

Теперь вместо пустой страницы вы увидите красиво оформленный отчёт с полной трассировкой. Это особенно полезно при работе с классами, фреймворками (Laravel, Symfony) и сложной логикой.

Для простых скриптов достаточно display_errors + E_ALL, но Xdebug — это мощный инструмент, который стоит освоить каждому PHP-разработчику.