- Как в PHP 8 показать все ошибки
- Где настраивается вывод ошибок в PHP
- Настройка вывода ошибок в PHP скрипте
- Настройка вывода ошибок PHP в файле .htaccess
- Настройка вывода всех ошибок в файле php.ini
- Вывод ошибок в журнал веб-сервера
- Директива «error_reporting(‘all’);» и ошибка «Uncaught TypeError: error_reporting()»
- Как включить вывод ошибок PHP
- Через .htaccess
- Через логи PHP
- Через файл php.ini
- Лог ошибок PHP
- Включение лога ошибок PHP в php.ini
- Как узнать еще режим работы PHP и текущее значение параметра error_log
- Как включить лог ошибок php в .htacccess при использовании Apache с mod_php
Как в 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
Это означает, что выводятся все ошибки, кроме предупреждений об устаревших конструкциях и предупреждения, вызванные строгой проверкой кода.
Чтобы выводить все ошибки и предупреждения, установите следующее значение:
- E_ALL (Показать все ошибки, предупреждения и уведомления, включая стандарты написания кода.)
- E_ALL & ~E_NOTICE (Показать все ошибки, кроме уведомлений)
- E_ALL & ~E_NOTICE & ~E_STRICT (Показать все ошибки, кроме уведомлений и предупреждений о стандартах написания кода.)
- E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Показать только ошибки)
Для того, чтобы изменения, сделанные в файле php.ini, вступили в силу, необходима перезагрузка веб-сервера.
- В Debian и производных дистрибутивах (Ubuntu, Linux Mint, Kali Linux и прочих) это делается командой:
sudo systemctl restart apache2.service
sudo systemctl restart httpd.service
Чтобы проверить, что настройки файла php.ini действительно применяются, создайте файл, например, с именем info.php и скопируйте в него:
Если вы создали файл в корневой папке веб-сервера, то в веб-браузере откройте адрес http://localhost/info.php.
На следующем скриншоте показано, что вывод ошибок отключён в файле php.ini:
На этом скриншоте видно, что вывод ошибок включён в файле php.ini:
Вывод ошибок в журнал веб-сервера
Настройка вывода ошибок в журнал веб-сервера настраивается в файле php.ini.
Для этого используется следующая директива:
Расположение файла с ошибка настраивается в конфигурации веб-сервера.
Директива «error_reporting(‘all’);» и ошибка «Uncaught TypeError: error_reporting()»
При попытке использовать следующую конструкцию:
Вы столкнётесь с ошибкой 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 \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 и означает показывать все ошибки, замечания и рекомендации:
Как включить вывод ошибок PHP
Хостинг-провайдеры нередко отключают или блокируют вывод всех ошибок и предупреждений. Такие ограничения вводятся не просто так. Дело в том, что на рабочих серверах крайне не рекомендуется держать ошибки в открытом доступе. Информация о неисправностях может стать «наживкой» для злоумышленников.
При этом в процессе разработки сайтов и скриптов, очень важно отслеживать возникающие предупреждения. Знать о сбоях и неисправностях также важно и системным администраторам — это позволяет предотвратить проблемы на сайте или сервере.
Самый оптимальный вариант — не просто скрыть показ ошибок, но и настроить запись о них в логах. Это позволит отслеживать предупреждения и не подвергать сервер угрозе.
В статье мы расскажем, как включить и отключить через .htaccess вывод ошибок php, а также двумя другими способами — через скрипт PHP и через файл php.ini.
Обратите внимание: в некоторых случаях изменение настроек вывода возможно только через обращение в техническую поддержку хостинга.
Через .htaccess
Перейдите в каталог сайта и откройте файл .htaccess.
Вариант 1. Чтобы включить вывод, добавьте следующие строки:
php_flag display_startup_errors on php_flag display_errors on php_flag html_errors on
Чтобы отключить ошибки PHP htaccess, введите команду:
php_flag display_startup_errors off php_flag display_errors off php_flag html_errors off
Также выключить .htaccess display errors можно командой:
php_flag display_startup_errors off php_flag display_errors off php_flag html_errors off php_value docref_root 0 php_value docref_ext 0
Через логи PHP
Если вам нужно проверить или выключить ошибки только в определенных файлах, это можно сделать с помощью вызова PHP-функций.
Вариант 1. Чтобы включить вывод, используйте команду error_reporting. В зависимости от типа ошибок, которые вы хотите увидеть, подставьте нужное значение. Например, команда для вывода всех ошибок будет выглядеть так:
А для всех типов, исключая тип Notice, так:
error_reporting(E_ALL & ~E_NOTICE)
Чтобы отключить вывод, введите команду:
Чтобы отключить логирование повторяющихся ошибок, введите:
# disable repeated error logging php_flag ignore_repeated_errors on php_flag ignore_repeated_source on
Вариант 2. Чтобы проверить конкретный кусок кода, подойдет команда ниже. В зависимости от типа ошибок, которые вы хотите увидеть, в скобках подставьте нужное значение. Например, команда для вывода всех ошибок будет выглядеть так:
ini_set('display_errors', 'On') error_reporting(E_ALL)
После этого в консоли введите:
ini_set('display_errors', 'Off')
Вариант 3. Ещё один из вариантов подключения через скрипт:
php_flag display_startup_errors on php_flag display_errors on
php_flag display_startup_errors off php_flag display_errors off
Вариант 4. Чтобы настроить вывод с логированием через конфигурацию веб-сервера, введите:
- для Apache — ErrorLog «/var/log/apache2/my-website-error.log» ,
- для Nginx — error_log /var/log/nginx/my-website-error.log .
Подробнее о других аргументах читайте в документации на официальном сайте php.net.
Через файл php.ini
Настроить отслеживание также можно через файл php.ini. Этот вариант подойдет, когда отображение или скрытие ошибок нужно настроить для всего сайта или кода. Обратите внимание: возможность настройки через файл php.ini есть не у всех, поскольку некоторые хостинг-провайдеры частично или полностью закрывают доступ к файлу.
Вариант 1. Если у вас есть доступ, включить вывод можно командой:
После этого нужно перезагрузить сервер:
sudo apachectl -k graceful
Вариант 2. Чтобы включить вывод, используйте команду error_reporting. В зависимости от типа ошибок, которые вы хотите увидеть, после знака = подставьте нужное значение. Например, команда для вывода всех ошибок будет выглядеть так:
error_reporting = E_ALL display_errors On
После ввода перезагрузите сервер:
sudo apachectl -k graceful
Чтобы скрыть отображение, во второй строке команды укажите Оff вместо On:
Теперь вы знаете, как настроить не только через PHP и php.ini, но и через htaccess отображение ошибок.
Лог ошибок PHP
Когда на сервере не работает один из сайтов — причины следует искать в программном коде, прежде всего следует изучить лог ошибок РНР (актуально для большинства сайтов, РНР является самым популярным языком веб-программирования). В рамках материала рассмотрено как включить лог ошибок php.
Включение лога ошибок PHP в php.ini
Все параметры РНР — в том числе, версия — задаются в файле php.ini, в нем же включается ведение лога программных ошибок. Если для сервера используется какая-либо панель управления — логирование можно включить в ней, если настройки сделаны вручную, то и ведение лога нужно включать вручную.
Делается это следующим образом:
display_errors = Off
log_errors = On
error_log = /var/log/php-errors.log
При активации display_errors ошибки будут выводится на экран, в директиве error_log задается путь к файлу, в который будет писаться информация необходимая для отладки проекта.
Затем нужно создать файл php-errors.log, на него необходимо выставить права позволяющие веб-серверу записывать в файл данные. В Debian подобных системах Apache работает от имени системного пользователя www-data
Затем нужно перезапустить веб-сервер, для Debian/Ubuntu
Получилось или нет можно увидеть в phpinfo. Там же можно посмотреть режим работы РНР (если это Apache Handler, то есть еще один способ включения лога, об этом ниже).
Как узнать еще режим работы PHP и текущее значение параметра error_log
Можно создать в корне сайта, работающего с сервера файл phpinfo и поместить в него одну функцию
И обратиться к файлу из браузера
http://sitename.com/phpinfo.php
Если применяются редиректы может потребоваться временно переименовать файл .htaccess в корне сайта.
В выводе phpinfo.php можно будет увидеть всю информацию о существующих настройках РНР
Режим работы РНР в примере Apache 2.0 Handler — РНР работает в режиме модуля веб-сервера.
Значение error_log отсутствует, значит в данной конфигурации логирование на уровне конфигурации сервера не включено.
Описанный выше порядок действий позволит включить логирование ошибок РНР при любом режиме работы РНР. При отладке работы сайта при конфигурации с mod-apache следует также проверять логи веб-сервера.
Вся информация будет в них, логи нужно искать в /var/log/apache2 и /var/log/httpd в зависимости от дистрибутива. Лог можно найти выполнив
Как включить лог ошибок php в .htacccess при использовании Apache с mod_php
При использовании Apache с mod_php есть альтернативный вариант не требующий редактирования php.ini.
В .htaccess в корне сайта добавляется:
php_flag log_errors On
php_value error_log /var/log/php-errors.log
Выключается логирование установкой основной опции в Off
php_flag log_errors Off
Плюс такого способа в том, что его можно использовать на серверах где нет root доступа. Настройки будут применяться не ко всему серверу, а только к сайту в корне которого добавлен .htaccess.
С fast_cgi директива php_flag работать не будет — возникнет ошибка 500.
Читайте про ошибку 500 и ее причины. Очень часто она появляется как следствие неверной отработки скриптов или настроек сервера не удовлетворяющим требованиям программного кода сайта.