I've written a custom Error handler for use in PHP. What it does is simply capture PHP errors, and logs them using Monolog.
It works, but I can't help that it has too much stuff inside. I could remove the error levels that are not handled by set_error_handler
but that's guaranteed to lead to a developer that spends 2 hours wondering "why E_ERRORs are not getting logged"...
Could this function be improved somehow?
set_error_handler(function($errno ,$errstr,$errfile ,$errline, $errcontext) {
// When we use the error supressing operator (@)
// error_reporting is temporarily set to 0
// Do not log anything for that case
if(ini_get('error_reporting')==0){return;}
$halt = FALSE;
// http://php.net/manual/en/errorfunc.constants.php
switch($errno){
case E_USER_ERROR:
case E_RECOVERABLE_ERROR:
$halt = true;
$logType = 'error';
break;
case E_WARNING:
case E_USER_WARNING:
case E_STRICT:
case E_DEPRECATED:
$logType = 'warning';
break;
case E_NOTICE:
case E_USER_NOTICE:
$logType = 'notice';
break;
// The following error types cannot be caught by set_error_handler
// Adding them for reference only
case E_CORE_WARNING:
case E_COMPILE_ERROR:
case E_COMPILE_WARNING:
case E_CORE_ERROR:
case E_ERROR:
case E_PARSE:
return FALSE;
// We should never reach this case. But you never know
case E_ALL:
default:
$logType = 'warning';
}
Logger::{$logType}($errstr, $errcontext);
// Halt the execution for errors that should halt
if($halt)
exit($errno);
});