Как заставить PHP показывать ошибки: полный гайд для новичков

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

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

Начать курс

Введение: почему PHP молчит, когда что-то идёт не так?

Вы когда-нибудь писали PHP-скрипт, запускали его в браузере — и видели... пустую белую страницу? Никаких сообщений, никаких подсказок. Только тишина и чувство, что вы сделали что-то не так. Знакомо?

Это одна из самых частых проблем, с которой сталкиваются новички в PHP. Вопрос «How can I get useful error messages in PHP?» на Stack Overflow собрал тысячи просмотров. И неудивительно: без внятных сообщений об ошибках отладка превращается в гадание на кофейной гуще.

В этой статье мы разберём, как «разговорить» PHP, чтобы он честно рассказывал вам, что именно пошло не так. Вы узнаете, какие настройки отвечают за вывод ошибок, как включить их на разных этапах разработки, и что делать, если ошибки всё равно не показываются. Поехали!

Почему PHP по умолчанию скрывает ошибки?

Прежде чем мы начнём колдовать над настройками, давайте поймём причину. PHP — это язык, который работает на сервере. На боевых (production) серверах показывать ошибки пользователям — плохая практика. Представьте: вместо красивой страницы интернет-магазина клиент видит что-то вроде Fatal error: Call to undefined function. Это не только некрасиво, но и небезопасно — злоумышленник может узнать структуру вашего кода.

Поэтому разработчики PHP сделали так, что по умолчанию вывод ошибок в браузер отключён. Но на локальном сервере (например, OpenServer, XAMPP, MAMP) или на этапе разработки это сильно мешает. Давайте это исправим.

Способ 1: Включаем ошибки через php.ini (глобально)

Самый надёжный способ — изменить конфигурационный файл php.ini. Найдите его в папке с вашим PHP (или в панели управления вашего локального сервера). Откройте файл и найдите (или добавьте) следующие строки:

display_errors = On
error_reporting = E_ALL

Что это значит?

  • display_errors = On — разрешает выводить ошибки прямо на экран (в браузер или консоль).
  • error_reporting = E_ALL — говорит PHP показывать все типы ошибок: от предупреждений (warnings) до фатальных.

После изменений перезапустите веб-сервер (Apache, Nginx). Теперь любой скрипт будет выводить ошибки.

Важно: На боевом сервере никогда не оставляйте display_errors = On. Используйте Off и настройте логирование (об этом ниже).

Способ 2: Включаем ошибки прямо в скрипте (быстрый способ)

Если у вас нет доступа к php.ini (например, вы на shared-хостинге), или вы хотите включить ошибки только для одного файла, используйте функции ini_set() и error_reporting(). Добавьте эти строки в самое начало вашего PHP-скрипта:

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Ваш код дальше
$foo = 1/0; // Вызовет Warning: Division by zero
?>

Разберём по строкам:

  • ini_set('display_errors', 1) — включает вывод ошибок на экран.
  • ini_set('display_startup_errors', 1) — включает ошибки, которые возникают при запуске PHP (например, если сам скрипт не может загрузиться).
  • error_reporting(E_ALL) — показывает все уровни ошибок.

Этот метод работает мгновенно и не требует перезагрузки сервера. Идеально для быстрой отладки.

Способ 3: Используем .htaccess (для Apache)

Если у вас сервер Apache, вы можете включить ошибки через файл .htaccess в корневой папке сайта. Добавьте туда:

php_flag display_errors on
php_value error_reporting E_ALL

После сохранения файла ошибки начнут показываться для всех скриптов в этой папке и её подпапках. Удобно, когда нужно быстро включить отладку на проекте без изменения php.ini.

Что делать, если ошибки всё равно не показываются?

Бывает, вы всё настроили, а страница всё равно белая. Вот три самые частые причины:

  1. Синтаксическая ошибка в самом скрипте. Если вы допустили ошибку до того, как вызвали ini_set(), PHP может не выполнить эти строки. Проверьте, нет ли лишних точек с запятой или незакрытых скобок.
  2. Ошибка парсинга (Parse error). Например, забыли закрывающую скобку } или кавычку. В этом случае PHP вообще не выполняет скрипт. Решение: проверьте код через онлайн-валидатор или включите ошибки через php.ini.
  3. Вывод ошибок заблокирован на уровне хостинга. Некоторые провайдеры запрещают display_errors. В этом случае остаётся только логирование (читайте ниже).

Логирование ошибок: сохраняем ошибки в файл

Показывать ошибки на экране — круто для разработки, но для продакшена это табу. Вместо этого вы должны логировать их — записывать в файл. Это позволяет вам видеть все проблемы, не показывая их пользователям.

Включите логирование в php.ini:

log_errors = On
error_log = /var/log/php_errors.log

Или прямо в скрипте:

<?php
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/errors.log');

// Теперь все ошибки будут записываться в файл errors.log в той же папке
?>

Теперь вы можете открыть этот файл в текстовом редакторе и увидеть все ошибки, которые произошли на сайте. Удобно и безопасно.

Обработка ошибок через исключения (Exception)

Современный PHP (начиная с версии 7) рекомендует использовать исключения для обработки ошибок. Это даёт вам полный контроль над тем, что происходит, когда что-то ломается.

Пример с блоком try-catch:

<?php
try {
    // Пытаемся выполнить опасный код
    $result = 1 / 0; // Это вызовет DivisionByZeroError
} catch (DivisionByZeroError $e) {
    // Ловим ошибку и делаем что-то полезное
    echo 'Ошибка: ' . $e->getMessage();
    file_put_contents('errors.log', $e                

Блоги

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