«PHP показывает белый экран, а мне нужны ошибки!» — знакомая ситуация?
Вы пишете код на PHP, запускаете скрипт, а вместо результата — пустота. Или, что ещё хуже, какая-то странная ошибка без единого намёка на причину. Знакомо? Если вы когда-либо задавались вопросом «How can I get useful error messages in PHP?» — вы не одиноки. Этот вопрос на Stack Overflow собрал тысячи просмотров, и неспроста. PHP по умолчанию настроен так, чтобы скрывать ошибки на production-серверах, но на этапе разработки это превращается в настоящую головную боль.
В этой статье мы разберём все способы заставить PHP говорить с вами на понятном языке. Вы узнаете, как включить отображение ошибок, настроить уровень их детализации и логировать их, чтобы отладка перестала быть гаданием. Поехали!
Почему PHP молчит? Корень зла — настройки сервера
Прежде чем мы научимся получать полезные сообщения, давайте поймём, почему их нет. PHP — язык со строгой философией безопасности. На боевых (production) серверах показывать ошибки пользователям — дурной тон и угроза безопасности. Поэтому в php.ini (главном конфигурационном файле PHP) по умолчанию стоят такие настройки:
display_errors = Off— ошибки не выводятся на экран.error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT— показывать не все типы ошибок.
Но для локальной разработки это катастрофа. Как это исправить? Есть три основных пути.
Способ 1: Меняем php.ini (если есть доступ)
Самый надёжный способ — отредактировать файл php.ini. Найдите его (обычно он лежит в корне установки PHP или в папке etc/ на Linux). Затем найдите и измените следующие строки:
; Включаем вывод ошибок на экран
display_errors = On
; Устанавливаем максимальный уровень отчёта (все ошибки, кроме заметок устаревания)
error_reporting = E_ALL
После изменений обязательно перезапустите веб-сервер (Apache, Nginx или встроенный сервер PHP), иначе настройки не применятся.
Важно: На боевом сервере display_errors всегда должен быть Off. Используйте этот метод только для разработки.
Способ 2: Используем .htaccess (для Apache)
Если у вас нет доступа к php.ini, но вы используете Apache, можно переопределить настройки через файл .htaccess в корне вашего сайта. Добавьте в него:
php_flag display_errors on
php_value error_reporting E_ALL
Это сработает, если Apache разрешает переопределение директив PHP (обычно это так на большинстве хостингов).
Способ 3: Включаем ошибки прямо в коде (самый гибкий)
Это мой любимый метод для быстрой отладки. Вы можете вставить эти строки в начало скрипта (сразу после <?php):
<?php
// Включаем максимальный уровень отчёта об ошибках
error_reporting(E_ALL);
// Включаем вывод ошибок на экран
ini_set('display_errors', 1);
// Включаем вывод ошибок запуска (например, если ошибка в самом ini_set)
ini_set('display_startup_errors', 1);
?>
Теперь любой Warning, Notice или Fatal Error будет показан прямо в браузере. Удобно, правда?
Какие типы ошибок бывают в PHP и что они означают?
Чтобы читать «сигналы» PHP, нужно знать их язык. Вот основные типы ошибок, которые вы будете видеть чаще всего:
- E_ERROR — фатальная ошибка. Скрипт останавливается. Пример: вызов несуществующей функции.
- E_WARNING — предупреждение. Скрипт продолжает работу, но что-то пошло не так. Пример:
include()несуществующего файла. - E_NOTICE — уведомление. Не ошибка, но потенциальная проблема. Пример: использование неопределённой переменной.
- E_PARSE — синтаксическая ошибка. Скрипт не запускается. Пример: пропущенная точка с запятой.
Используя error_reporting(E_ALL), вы включаете отчёт по всем этим типам. Но иногда нужно отфильтровать. Например, если вас не интересуют уведомления:
// Показывать всё, кроме E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
Как поймать ошибку и не дать ей убить скрипт?
Просто включить ошибки — полдела. Хороший программист умеет их обрабатывать. Для этого в PHP есть конструкция try-catch и функция set_error_handler().
Пример с try-catch (для исключений)
Не все ошибки PHP являются исключениями. Но если вы используете современные библиотеки или PDO, исключения — ваш лучший друг:
<?php
try {
// Код, который может выдать ошибку
$file = fopen("nonexistent_file.txt", "r");
if (!$file) {
throw new Exception("Файл не найден!");
}
} catch (Exception $e) {
echo 'Поймано исключение: ' . $e->getMessage();
}
?>
Пример с set_error_handler()
А что, если нужно поймать обычный Warning или Notice? Для этого создаём свой обработчик:
<?php
function myErrorHandler($errno, $errstr, $errfile, $errline) {
echo "<b>Ошибка:</b> [$errno] $errstr в файле $errfile на строке $errline<br>";
return true; // Не передаём обработку стандартному обработчику PHP
}
// Устанавливаем наш обработчик
set_error_handler("myErrorHandler");
// Теперь любая ошибка попадёт в нашу функцию
echo $undefined_variable; // Вызовет Notice, но мы его увидим
?>
Это мощный инструмент для кастомизации логирования. Вы можете не только выводить ошибки на экран, но и писать их в файл, отправлять на почту или в Telegram.
Логирование ошибок: когда экран — не лучший друг
На production-сервере показывать ошибки нельзя, но терять их тоже нельзя. Решение — логирование. Включаем запись ошибок в файл:
// В php.ini
log_errors = On
error_log = /var/log/php_errors.log
Или прямо в коде:
ini_set('log_errors', 1);
ini_set('error_log', '/home/user/logs/php_errors.log');
Теперь все ошибки будут