Как вывести ошибки 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.