Как получать полезные сообщения об ошибках в 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-разработчику.