Я смущен тем, как правильно использовать set_error_handler (), и php-документация на самом деле не помогает уточнить.
Я хочу, чтобы он выслал мне по электронной почте столько ошибок, сколько возможно, за исключением уведомлений.
<?php if (TRAP_ERRORS) { // True on production, false in development, where errors are just echoed out. set_exception_handler('globalExceptionHandler'); set_error_handler('globalErrorHandler', E_USER_WARNING); } function globalExceptionHandler($e) { //log and email stuff here } function globalErrorHandler($errno, $errstr, $errfile, $errline) { switch ($errno) { case E_NOTICE: case E_USER_NOTICE: $errors = "Notice"; break; case E_WARNING: case E_USER_WARNING: $errors = "Warning"; break; case E_ERROR: case E_USER_ERROR: $errors = "Fatal Error"; break; default: $errors = "Unknown Error"; break; } error_log(sprintf("PHP %s: %s in %s on line %d", $errors, $errstr, $errfile, $errline)); $msg = "ERROR: [$errno] $errstr\r\n". "$errors on line $errline in file $errfile\r\n"; sendErrorEmail($msg); showErrorPage(); exit(1); } function sendErrorEmail($p_errorMsg) { // Parse and sent out the error email... } function showErrorPage() { // Redirect to an error page. } ?>
Выше мой текущий параметр set_error_handler('globalErrorHandler', E_USER_WARNING);
, что кажется неправильным в том смысле, что оно не охватывает ошибки trigger_error (). Я считаю, что это потому, что аргумент должен быть битовой маской вместо одного уровня ошибки, но я не уверен, как настроить его на максимальное количество ошибок / информации (кроме уведомлений). Я видел примеры, которые используют E_ALL
, но на самом деле непосредственно вызывает какой-либо код, который включает в себя всю информацию об ошибках для ошибки.
Так или иначе, как мне использовать set_error_handler, так что максимальный объем информации может обрабатываться моим настраиваемым обработчиком ошибок (чтобы я мог автоматически получать электронные письма, когда возникают такие проблемы, вместо того, чтобы просматривать журналы позже).
set_error_handler('some_handler',E_ALL & ~E_NOTICE & ~E_USER_NOTICE);
Или, если вы действительно хотите все,
set_error_handler('some_handler',-1 & ~E_NOTICE & ~E_USER_NOTICE);
Кроме того, вы можете просто установить его для использования всех ошибок и просто игнорировать его, если он не находится в error_reporting
(который вы устанавливаете на то же значение, что и указанная выше строка, также работает оператор @
):
.... if(!($errno & error_reporting())) return true; switch($errno){ ....
Оставьте второй параметр или перейдите по умолчанию E_ALL | E_STRICT
E_ALL | E_STRICT
(все ошибки и ошибки строгости, не путайте побитовое OR
здесь)
Кроме того, вы можете «уловить» Fatal errors
, выполнив error_get_last()
здесь error_get_last()
register_shutdown_function()
и error_get_last()
: обрабатывать фатальные ошибки в PHP с помощью register_shutdown_function ()
$error_type
– целое число, которое вы $error_type
с помощью маскировки. Чтобы использовать обработчик ошибок для всего, кроме E_NOTICE, вы должны использовать одно из следующих:
set_error_handler('globalErrorHandler', E_ALL ^ E_NOTICE); set_error_handler('globalErrorHandler', E_ALL & ~E_NOTICE);
Если вы хотите также исключить E_USER_NOTICE, то:
set_error_handler('globalErrorHandler', E_ALL ^ (E_NOTICE | E_USER_NOTICE)); set_error_handler('globalErrorHandler', E_ALL & ~E_NOTICE & ~E_USER_NOTICE);
Обратите внимание на использование побитовых операторов «&», «~» и «|», см. Руководство по побитому оператору PHP .
Будьте осторожны, некоторые ошибки не будут подняты, если они возникнут перед вызовом set_error_handler или будут ошибками компилятора (маловероятно, но кто знает). См. Документацию PHP set_error_handler .
Как использовать запланированные задачи, чтобы сервер автоматически отправлял вам файлы журнала ошибок; вместо того, чтобы обрабатывать его таким образом в своем приложении ..