PHP: Как использовать set_error_handler () для правильной обработки всех ошибок, кроме уведомлений?

Я смущен тем, как правильно использовать 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 .

Как использовать запланированные задачи, чтобы сервер автоматически отправлял вам файлы журнала ошибок; вместо того, чтобы обрабатывать его таким образом в своем приложении ..