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'); |
PHP
В htaccess
php_value error_reporting "E_ALL" |
|
php_flag display_errors On |
htaccess
На рабочем проекте вывод ошибок лучше сделать только у авторизированного пользователя или в крайнем случаи по 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'); |
PHP
Файлы логов также не должны быть доступны из браузера, храните их в закрытой директории с файлом .htaccess:
Order Allow,Deny |
|
Deny from all |
htaccess
Или запретить доступ к файлам по расширению .log (заодно и другие системные файлы и исходники):
<FilesMatch ".(htaccess|htpasswd|bak|ini|log|sh|inc|config|psd|fla|ai)$"> |
|
Order Allow,Deny |
|
Deny from all |
|
</FilesMatch> |
htaccess
Отправка ошибок на e-mail
Ошибки можно отправлять на е-mail разработчика, но приведенные методы не работает при критических ошибках.
Первый – register_shutdown_function()
регистрирует функцию, которая выполнится при завершении работы скрипта, error_get_last()
получает последнюю ошибку.
function error_alert() |
|
{ |
|
$error = error_get_last(); |
|
if (!empty($error)) { |
|
mail('mail@example.com', 'Ошибка на сайте example.com', print_r($error, true)); |
|
} |
|
} |
|
register_shutdown_function('error_alert'); |
PHP
Второй метод использует «пользовательский обработчик ошибок», поэтому в браузер ошибки выводится не будут.
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
Пользовательские ошибки
PHP позволяет разработчику самому объявлять ошибки, которые выведутся в браузере или в логе. Для создания ошибки используется функция trigger_error()
:
trigger_error('Пользовательская ошибка', E_USER_ERROR);
PHP
Результат:
Fatal error: Пользовательская ошибка in /public_html/script.php on line 2
E_USER_ERROR
– критическая ошибка,E_USER_WARNING
– не критическая,E_USER_NOTICE
– сообщения которые не являются ошибками,E_USER_DEPRECATED
– сообщения о устаревшем коде.