На самом деле вы можете обрабатывать синтаксические и фатальные ошибки. Верно, что функция обработчика ошибок, которую вы определили с помощью set_error_handler (), не будет вызываться. Способ сделать это - определить функцию выключения с помощью register_shutdown_function (). Вот что я работал на своем веб-сайте:
Файл prepend.php (этот файл будет автоматически добавлен ко всем скриптам php). Ниже приведены советы по добавлению файлов в PHP.
set_error_handler("errorHandler");
register_shutdown_function("shutdownHandler");
function errorHandler($error_level, $error_message, $error_file, $error_line, $error_context)
{
$error = "lvl: " . $error_level . " | msg:" . $error_message . " | file:" . $error_file . " | ln:" . $error_line;
switch ($error_level) {
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_PARSE:
mylog($error, "fatal");
break;
case E_USER_ERROR:
case E_RECOVERABLE_ERROR:
mylog($error, "error");
break;
case E_WARNING:
case E_CORE_WARNING:
case E_COMPILE_WARNING:
case E_USER_WARNING:
mylog($error, "warn");
break;
case E_NOTICE:
case E_USER_NOTICE:
mylog($error, "info");
break;
case E_STRICT:
mylog($error, "debug");
break;
default:
mylog($error, "warn");
}
}
function shutdownHandler() //will be called when php script ends.
{
$lasterror = error_get_last();
switch ($lasterror['type'])
{
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
case E_RECOVERABLE_ERROR:
case E_CORE_WARNING:
case E_COMPILE_WARNING:
case E_PARSE:
$error = "[SHUTDOWN] lvl:" . $lasterror['type'] . " | msg:" . $lasterror['message'] . " | file:" . $lasterror['file'] . " | ln:" . $lasterror['line'];
mylog($error, "fatal");
}
}
function mylog($error, $errlvl)
{
...do whatever you want...
}
PHP вызовет функцию errorHandler (), если он обнаружит ошибку в любом из скриптов. Если ошибка заставляет скрипт немедленно отключиться, ошибка обрабатывается функцией shutdownHandler ().
Это работает на сайте, который я разрабатываю. Я еще не тестировал его на производстве. Но в настоящее время он ловит все ошибки, которые я обнаружил при разработке.
Я считаю, что существует риск перехвата одной и той же ошибки дважды, по каждой функции. Это может произойти, если ошибка, которую я обрабатываю в функции shutdownHandler (), также была обнаружена функцией errorHandler ().
TODO's:
1 - Мне нужно работать лучше log () для корректной обработки ошибок. Поскольку я все еще в разработке, я в основном регистрирую ошибку в базе данных и повторяю ее на экране.
2 - Реализация обработки ошибок для всех вызовов MySQL.
3 - Реализация обработка ошибок для моего кода javascript.
ВАЖНЫЕ ПРИМЕЧАНИЯ:
1 - Я использую следующую строку в моем php.ini, чтобы автоматически добавить вышеприведенный скрипт ко всем скриптам php:
auto_prepend_file = "/homepages/45/d301354504/htdocs/hmsee/cgi-bin/errorhandling.php"
работает хорошо.
2 - Я регистрирую и разрешаю все ошибки, включая ошибки E_STRICT. Я верю в разработку чистого кода. Во время разработки мой файл php.ini имеет следующие строки:
track_errors = 1
display_errors = 1
error_reporting = 2147483647
html_errors = 0
Когда я перехожу вживую, я изменил display_errors на 0, чтобы уменьшить риск того, что мои пользователи будут видеть уродливые сообщения об ошибках PHP.
Надеюсь, это поможет кому-то.