- Управление выводом ошибок PHP
- Вывод ошибок в браузере
- В htaccess
- Запись ошибок в лог файл
- Отправка ошибок на e-mail
- Пользовательские ошибки
- Результат:
- Отображение ошибок PHP через .htaccess и другими способами
- Способы вывода ошибок PHP
- Преимущества вывода ошибок в файле .htaccess
- Виды ошибок PHP в файле .htaccess
- Как включить вывод ошибок через .htaccess
- Примеры практического применения
- Включение журналирования ошибок PHP в .htaccess
- Дополнительные способы вывода ошибок PHP
- Вывод ошибок в PHP-скрипте
- Через файл php.ini
- Вывод ошибок в PHP
- Включить ошибки в PHP
- Включение ошибок и предупреждений в php-скрипте
- Включение ошибок и предупреждений в файле .htaccess
- Включение ошибок и предупреждений в файле php.ini
Управление выводом ошибок PHP
PHP предлагает гибкие настройки вывода ошибок, среди которых функия error_reporting($level) – задает, какие ошибки PHP попадут в отчет, могут быть значения:
- E_ALL – все ошибки,
- E_ERROR – критические ошибки,
- E_WARNING – предупреждения,
- E_PARSE – ошибки синтаксиса,
- E_NOTICE – замечания,
- E_CORE_ERROR – ошибки обработчика,
- E_CORE_WARNING – предупреждения обработчика,
- E_COMPILE_ERROR – ошибки компилятора,
- E_COMPILE_WARNING – предупреждения компилятора,
- E_USER_ERROR – ошибки пользователей,
- E_USER_WARNING – предупреждения пользователей,
- E_USER_NOTICE – уведомления пользователей.
Вывод ошибок в браузере
error_reporting(E_ALL); ini_set('display_errors', 'On');
В htaccess
php_value error_reporting "E_ALL" php_flag display_errors On
На рабочем проекте вывод ошибок лучше сделать только у авторизированного пользователя или в крайнем случаи по IP.
Запись ошибок в лог файл
error_reporting(E_ALL); ini_set('display_errors', 'Off'); ini_set('log_errors', 'On'); ini_set('error_log', $_SERVER['DOCUMENT_ROOT'] . '/logs/php-errors.log');
Файлы логов также не должны быть доступны из браузера, храните их в закрытой директории с файлом .htaccess:
Order Allow,Deny Deny from all
Или запретить доступ к файлам по расширению .log (заодно и другие системные файлы и исходники):
Order Allow,Deny Deny from all
Отправка ошибок на e-mail
Ошибки можно отправлять на е-mail разработчика, но приведенные методы не работает при критических ошибках.
Первый – register_shutdown_function() регистрирует функцию, которая выполнится при завершении работы скрипта, error_get_last() получает последнюю ошибку.
register_shutdown_function('error_alert'); function error_alert() < $error = error_get_last(); if (!empty($error)) < mail('mail@example.com', 'Ошибка на сайте example.com', print_r($error, true)); >>
Стоит учесть что оператор управления ошибками (знак @) работать в данном случаи не будет и письмо будет отправляться при каждой ошибке.
Второй метод использует «пользовательский обработчик ошибок», поэтому в браузер ошибки выводится не будут.
function error_alert($type, $message, $file, $line, $vars) < $error = array( 'type' =>$type, 'message' => $message, 'file' => $file, 'line' => $line ); error_log(print_r($error, true), 1, 'mail@example.com', 'From: mail@example.com'); > set_error_handler('error_alert');
Пользовательские ошибки
PHP позволяет разработчику самому объявлять ошибки, которые выведутся в браузере или в логе. Для создания ошибки используется функция trigger_error() :
trigger_error('Пользовательская ошибка', E_USER_ERROR);
Результат:
Fatal error: Пользовательская ошибка in /public_html/script.php on line 2
- E_USER_ERROR – критическая ошибка,
- E_USER_WARNING – не критическая,
- E_USER_NOTICE – сообщения которые не являются ошибками,
- E_USER_DEPRECATED – сообщения о устаревшем коде.
Отображение ошибок PHP через .htaccess и другими способами
Ошибки в коде — неотъемлемая часть любого процесса разработки. Чтобы понять, почему не выполняется скрипт, необходимо вывести error-логи PHP на экран.
Следует помнить, что в публичной версии сайта вывод ошибок на экран должен быть отключён.
Способы вывода ошибок PHP
- Через файл .htaccess, отвечающий за дополнительные параметры сервера Apache.
- Непосредственно через PHP-скрипт.
- Через файл php.ini, содержащий настройки интерпретатора PHP.
Преимущества вывода ошибок в файле .htaccess
- Широкий охват. Параметры распространяются на все элементы дочерних поддиректорий.
- Быстрота и удобство. Обработка ошибок настраивается в несколько команд и в одном месте.
Вывод ошибок на экран лучше делать через файл .htaccess, особенно когда PHP-файлов несколько. Поэтому далее разберём этот способ подробнее.
Виды ошибок PHP в файле .htaccess
- E_ALL — все виды ошибок, кроме E_STRICT до PHP 5.4.0.
- E_ERROR — фатальные ошибки, прекращающие работу скрипта.
- E_WARNING — ошибки-предупреждения. Не являются фатальными, поэтому не вызывают прекращение работы скрипта.
- E_PARSE — ошибки разбора. Могут возникать только во время компиляции.
- E_NOTICE — уведомления о нарушении времени выполнения скрипта.
- E_CORE_ERROR — фатальная ошибка обработчика. Генерируется ядром во время запуска PHP-скрипта.
- E_CORE_WARNING — предупреждения компиляции, возникающие при запуске PHP-скрипта.
- E_COMPILE_ERROR — фатальные ошибки, возникающие на этапе компиляции.
- E_COMPILE_WARNING — предупреждение компилятора PHP-скриптов.
- E_USER_ERROR — ошибки, сгенерированные пользователями.
- E_USER_WARNING — предупреждения, сгенерированные пользователями.
- E_USER_NOTICE — уведомления, сгенерированные пользователями.
Как включить вывод ошибок через .htaccess
Файл .htaccess должен находиться в корневой директории сайта (например, «public_html»). Отредактировать его можно с помощью проводника, доступного в панели хостинга.
Примечание. Если файла .htaccess нет, то его необходимо создать.
Включить отображение ошибок PHP и настроить фильтрацию их вывода можно двумя директивами: «display_errors» и «error_reporting». Первая отвечает за состояние режима показа ошибок («On» или «Off»), а вторая задаёт глубину отображения.
Показать ошибки PHP на экране можно с помощью следующего кода:
php_flag display_errors on php_value error_reporting -1
После сохранения изменённого файла, следует обновить страницу.
Примеры практического применения
Используя указанный код, можно быстро включить или отключить вывод ошибок, а также настроить различные конфигурации для разных режимов работы.
Следующий код скроет ошибки PHP с экрана:
# скрыть ошибки php 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 php_flag log_errors on # месторасположение журнала ошибок PHP php_value error_log /var/www/имя_пользователя/data/www/ваш_www-домен/
Чтобы обработка ошибок в .htaccess выполнялась безопасно надо обязательно защитить папку с log-файлами от внешнего доступа при помощи следующего кода:
# запретить доступ к журналу ошибок PHPOrder allow,deny Deny from all Satisfy All
Можно также настроить фильтрацию. Флаг «integer» указывает на глубину вывода данных (уровень показа). Значение «0» не выведет никаких ошибок. Комбинация «8191» запишет в log-файл сбои всех уровней.
# общая директива для фильтрации ошибок php php_value error_reporting integer
Чтобы текст ошибок не обрезался, можно установить максимальный размер на строку:
# общая директива для установки максимального размера строки log_errors_max_len integer
Выключение записи повторяющихся ошибок сократит объём поступающих данных и улучшит восприятие информации:
# отключить запись повторяющихся ошибок php_flag ignore_repeated_errors on php_flag ignore_repeated_source on
В результате настройки .htaccess для сайта, находящегося в публичном доступе, должны выглядеть так:
# обработка ошибок PHP для публичного ресурса php_flag display_startup_errors off php_flag display_errors off php_flag html_errors off php_flag log_errors on php_flag ignore_repeated_errors off php_flag ignore_repeated_source off php_flag report_memleaks on php_flag track_errors on php_value docref_root 0 php_value docref_ext 0 php_value error_reporting -1 php_value log_errors_max_len 0Order allow,deny Deny from all Satisfy All
Во время разработки или отладки файл .htaccess должен содержать следующий код:
# Обработка ошибок PHP во время разработки php_flag display_startup_errors on php_flag display_errors on php_flag html_errors on php_flag log_errors on php_flag ignore_repeated_errors off php_flag ignore_repeated_source off php_flag report_memleaks on php_flag track_errors on php_value docref_root 0 php_value docref_ext 0 php_value error_log /home/path/public_html/domain/PHP_errors.log # [see footnote 3] # php_value error_reporting 999999999 php_value error_reporting -1 php_value log_errors_max_len 0Order allow,deny Deny from all Satisfy All
Включение журналирования ошибок PHP в .htaccess
Когда отображение ошибок на странице выключено, необходимо запустить их журналирование следующим кодом:
# включение записи PHP ошибок php_flag log_errors onphp_value error_log /home/path/public_html/domain/PHP_errors.log
Примечание. Вместо « /home/path/public_html/domain/PHP_errors.log » нужно подставить собственный путь до директории, в которой будет вестись журнал ошибок.
Чтобы запретить доступ к журналу извне, нужно добавить следующий код:
# предотвращаем доступ к логу PHP ошибокOrder allow,deny Deny from all Satisfy All
Дополнительные способы вывода ошибок PHP
Можно добавить оператор «@», чтобы запретить показ ошибок в конкретной инструкции PHP:
Вывод ошибок в PHP-скрипте
Чтобы выводить все ошибки, нужно в начале скрипта прописать:
Если необходимо отображать ошибки PHP только из определённого места скрипта, то можно использовать следующий код:
ini_set('display_errors', 'On'); // сообщения с ошибками будут показываться error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки $value = $var[$key]; // пример ошибки ini_set('display_errors', 'Off'); // теперь сообщений НЕ будет
Примечание. Если заменить значения «On» и «Off» в первой и последней строках на противоположные, то на конкретном участке кода ошибки выводиться не будут.
Через файл php.ini
Включить или выключить показ ошибок на всём сайте/хостинге также можно с помощью файла «php.ini», в котором нужно изменить два следующих параметра:
error_reporting = E_ALL display_errors On
Первая строка отвечает за фильтрацию ошибок (в данном случае показываться будут все типы сбоев), а вторая активирует их отображение на экране. После изменений этого файла необходимо перезапустить сервер Apache.
Надежный хостинг для сайта. 14 дней — бесплатно!
Вывод ошибок в PHP
Нет кода без ошибок. Как говорят, на ошибках учатся. Ну, а мы сегодня научимся включать и отключать вывод ошибок в PHP.
Если вы видите белый экран, вместо какого-либо ожидаемого результата, значит скорее всего в вашем коде произошла ошибка. Посмотрите, если в ответе сервера пришёл статус ошибки, например 500, но при этом на экране ничего нет, то вам нужно включить вывод ошибок.
Включить ошибки в PHP
Включение ошибок и предупреждений в php-скрипте
Для того, чтобы включить ошибки прямо в скрипте, перед выполняемым кодом напишите следующее:
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);
После этого обновите страницу, сообщение об ошибке должно отобразиться. Вы также можете включить ошибки и предупреждения на уровне сервера.
Включение ошибок и предупреждений в файле .htaccess
Если у вас есть доступ к редактированию файла .htaccess, то пропишите в нём следующие строки:
php_value display_errors 1 php_value display_startup_errors 1 php_value error_reporting E_ALL
После этого перезапустите Apache.
Включение ошибок и предупреждений в файле php.ini
Конечно же, можно настроить отображение ошибок в конфигурационном файле PHP. Для этого, добавить в файл php.ini следующее:
error_reporting = E_ALL display_errors = On display_startup_errors = On
После этого перезапустите PHP.
Автор блога Борис Заболотских
Здравствуй дорогой читатель! Я рад приветствовать тебя на страницах моего блога. Уже несколько лет я занимаюсь веб-программированием и рад поделиться с тобой своими знаниями и советами. Если тебе понравились мои статьи, ты можешь подписаться на рассылку блога, из неё ты узнаешь много интересного!