Как заставить PHP показывать все ошибки: полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

«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');

Теперь все ошибки будут

Блоги

Рекомендаций по книгам