Как в PHP 8 настроить вывод всех ошибок
По умолчанию в PHP 8 отключён показ ошибок, поэтому если во время выполнения PHP скрипта возникла проблема, то на экран ничего не будет выведено. Если ошибка в программе произошла до вывода HTML кода, то вы увидите белый экран веб-браузера.
Где настраивается вывод ошибок в PHP
Вывод ошибок настраивается в:
- коде скрипта
- .htaccess файле
- в конфигурационном файле PHP (например, в php.ini)
Настройке в коде скрипта влияют на поведение только программы, в которую внесены настройки.
Настройки в файле .htaccess влияют на все скрипты, находящиеся в данной директории и поддиректориях.
Настройки в конфигурационном файле php.ini влияют на все запускаемые PHP скрипты, если в них не переназначены настройки вывода ошибок.
Помните, что вывод ошибок очень полезен во время написания и отладки кода, но на рабочих серверах вывод ошибок должен быть отключён, чтобы предотвратить утечку чувствительных данных и затруднить атакующему взлом сайта.
Настройка вывода ошибок в PHP скрипте
Для вывода всех ошибок, добавьте в начало скрипта следующие строки:
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);
Данные настройки включают вывод всех ошибок и предупреждений в веб-браузер пользователя.
Будут выведены предупреждения об использовании устаревших конструкций.
Настройка вывода ошибок в журналы веб-сервера выполняется отдельно.
Помните, что при возникновении фатальных ошибок, то есть когда скрипт даже не смог запуститься из-за неправильного синтаксиса PHP, то для вывода ошибок будут применяться правила, указанные в файле php.ini или .htaccess. Это обусловлено тем, что при неправильном синтаксисе интерпретатор PHP не понимает весь файл, в том числе и указанные выше директивы. То есть если в коде пропущена точка с запятой или фигурная скобка, то ошибки будут выводиться в соответствии с настройками в файле php.ini.
Настройка вывода ошибок PHP в файле .htaccess
Включение вывода ошибок в файле .htaccess выполняется следующими директивами:
php_flag display_startup_errors on php_flag display_errors on
Чтобы они сработали, необходимо, чтобы на веб-сервере была включена поддержка файлов .htaccess.
Вывод ошибок в журнал веб-сервера выполняется следующей директивой:
php_value error_log logs/all_errors.log
Настройка вывода всех ошибок в файле php.ini
Файл php.ini — это конфигурационный файл PHP.
При своей работе PHP может использовать более одного конфигурационного файла.
Расположение файла php.ini:
- В Debian и производных дистрибутивах (Ubuntu, Linux Mint, Kali Linux и прочих) зависит от версии PHP, например, для PHP 8.1 путь до файла следующий: /etc/php/8.1/apache2/php.ini
- В Arch Linux и производных дистрибутивах (Manjaro, BlackArch и прочих): /etc/php/php.ini
В файле php.ini вы найдёте следующие директивы:
display_errors = Off display_startup_errors = Off
Для включения вывода ошибок замените их на:
display_errors = On display_startup_errors = On
По умолчанию значение error_reporting установлено на:
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Это означает, что выводятся все ошибки, кроме предупреждений об устаревших конструкциях и предупреждения, вызванные строгой проверкой кода.
Чтобы выводить все ошибки и предупреждения, установите следующее значение:
error_reporting = E_ALL
Популярные значения:
- E_ALL (Показать все ошибки, предупреждения и уведомления, включая стандарты написания кода.)
- E_ALL & ~E_NOTICE (Показать все ошибки, кроме уведомлений)
- E_ALL & ~E_NOTICE & ~E_STRICT (Показать все ошибки, кроме уведомлений и предупреждений о стандартах написания кода.)
- E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Показать только ошибки)
Подробности смотрите по ссылке: https://www.php.net/manual/errorfunc.constants.php
Для того, чтобы изменения, сделанные в файле php.ini, вступили в силу, необходима перезагрузка веб-сервера.
- В Debian и производных дистрибутивах (Ubuntu, Linux Mint, Kali Linux и прочих) это делается командой:
sudo systemctl restart apache2.service
- В Arch Linux и производных дистрибутивах (Manjaro, BlackArch и прочих) это делается командой:
sudo systemctl restart httpd.service
Чтобы проверить, что настройки файла php.ini действительно применяются, создайте файл, например, с именем info.php и скопируйте в него:
<?php phpinfo();
Если вы создали файл в корневой папке веб-сервера, то в веб-браузере откройте адрес http://localhost/info.php.
На следующем скриншоте показано, что вывод ошибок отключён в файле php.ini:
На этом скриншоте видно, что вывод ошибок включён в файле php.ini:
Вывод ошибок в журнал веб-сервера
Настройка вывода ошибок в журнал веб-сервера настраивается в файле php.ini.
Для этого используется следующая директива:
log_errors = On
Расположение файла с ошибка настраивается в конфигурации веб-сервера.
Смотрите также: Почему в логах ошибок Apache не сохраняются записи об ошибке 404
Директива «error_reporting('all');» и ошибка «Uncaught TypeError: error_reporting()»
При попытке использовать следующую конструкцию:
error_reporting('all');
Вы столкнётесь с ошибкой Uncaught TypeError: error_reporting().
Полный лог ошибки:
[Wed Jul 06 07:29:19.410966 2022] [php:error] [pid 14101] [client 127.0.0.1:58402] PHP Fatal error: Uncaught TypeError: error_reporting(): Argument #1 ($error_level) must be of type ?int, string given in /srv/http/suip/index.php:3\nStack trace:\n#0 /srv/http/suip/index.php(3): error_reporting('all')\n#1 {main}\n thrown in /srv/http/suip/index.php on line 3, referer: http://localhost/suip/
Вместо 'all' вам нужно указать константу, выражающую уровень сообщения об ошибках. Допустимые значения провидены на этой страницы: https://www.php.net/manual/errorfunc.constants.php
Следующая запись является правильной для PHP 8 и означает показывать все ошибки, замечания и рекомендации:
error_reporting(E_ALL);
Связанные статьи:
- Вышел PHP 8: обзор изменений языка (53.8%)
- Как получить User Agent в PHP. Как настроить browscap.ini (44.7%)
- Как получить последний элемент массива в PHP (42.4%)
- Ошибка «No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php/php8.1-fpm.sock (*:80) failed» (РЕШЕНО) (41.4%)
- Ошибка «Cannot load modules/libphp7.so» (РЕШЕНО) (41%)
- Решение проблемы с ошибкой #1698 - Access denied for user 'root'@'localhost' (RANDOM - 0.5%)