Avatar ·

Как вывести ошибки PHP на экран? Ничего не работает

Всем привет! Я новичок в PHP и пишу свой первый сайт. Столкнулся с проблемой: когда в коде возникает ошибка, я вижу просто пустую страницу или белый экран смерти. Никаких сообщений об ошибках не выводится. Вот пример моего кода: ```php ``` Я ожидаю увидеть ошибку деления на ноль, но страница просто пустая. Пробовал добавить `error_reporting(E_ALL);` в начало файла — не помогло. Также пробовал `ini_set('display_errors', 1);` — тоже безрезультатно. У меня локальный сервер OpenServer, PHP версии 8.1. Что я делаю не так? Может быть, нужно что-то менять в php.ini? Или это проблема с настройками самого сервера? Подскажите, пожалуйста, как правильно настроить вывод ошибок, чтобы видеть их на экране во время разработки. Очень неудобно гадать, где именно ошибка в коде. P.S. Файл с кодом называется test.php, лежит в корне сервера. <<>>

Почему ошибки не отображаются?

Проблема в том, что на production-серверах вывод ошибок обычно отключён по соображениям безопасности. На локальном сервере их нужно явно включить. Деление на ноль в PHP 8.1 генерирует предупреждение (Warning), а не фатальную ошибку, поэтому без включённого вывода вы просто увидите пустую страницу.

Решение: включаем показ ошибок

Самый надёжный способ для разработки — добавить в начало скрипта (после <?php) следующие строки:

<?php
// Включаем отображение всех ошибок
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Ваш код
$number = 10;
echo "Результат: " . $number / 0;
?>

Теперь вы увидите:

Warning: Division by zero in C:\OpenServer\domains\test.php on line 7
Результат: INF

Почему не сработало раньше?

Возможные причины:

  • Порядок вызова: ini_set('display_errors', 1) должен быть выполнен до возникновения ошибки. Если ошибка в синтаксисе файла (например, пропущена точка с запятой), код даже не выполнится — тогда поможет только настройка в php.ini.
  • Синтаксические ошибки: Если в файле есть фатальная синтаксическая ошибка, PHP не сможет выполнить ini_set. В этом случае нужно править php.ini.

Настройка php.ini (для синтаксических ошибок)

Откройте файл php.ini (в OpenServer он находится в userdata/config/php-8.1/php.ini) и найдите/измените строки:

display_errors = On
display_startup_errors = On
error_reporting = E_ALL

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

Важные моменты для новичков

  • Не оставляйте display_errors = On на production-сервере — это угроза безопасности. Для продакшена используйте логирование ошибок.
  • Проверьте версию PHP: В PHP 8+ деление на ноль выдаёт Warning, а INF — это бесконечность. Раньше (в PHP 7) была ошибка DivisionByZeroError.
  • Используйте var_dump() и print_r() для отладки переменных, это часто полезнее, чем просто смотреть ошибки.

Альтернативный способ: .htaccess

Если нет доступа к php.ini, можно создать файл .htaccess в корне сайта:

php_flag display_errors on
php_value error_reporting 32767

Но этот метод работает только на Apache, не на Nginx.

<<>>

Использование функции error_reporting() для гибкого контроля

Если вам нужно включать отображение ошибок только для конкретного скрипта, а не глобально — используйте комбинацию функций:

<?php
// Включаем строгие типы (опционально)
declare(strict_types=1);

// Отключаем отображение Notice (уведомлений), но показываем Warning и Error
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);

// Включаем вывод на экран
ini_set('display_errors', 1);

// Ваш код
$result = 10 / 0;
echo $result;
?>

Также полезно использовать set_error_handler() для кастомной обработки ошибок:

function myErrorHandler($severity, $message, $file, $line) {
    if (error_reporting() & $severity) {
        echo "Ошибка [$severity]: $message в файле $file на строке $line\n";
    }
}
set_error_handler("myErrorHandler");

// Теперь любая ошибка будет выведена в вашем формате
echo 10 / 0;

Этот подход удобен, если вы хотите логировать ошибки в файл или отправлять их по email, а не просто выводить на экран. Но для простой отладки лучше использовать первый метод с ini_set.