我想记录每个致命错误,甚至超时和其他E_ERRORS错误.我使用set_error_handler和shutdown函数,但是最后一个我没有stacktrace.有没有办法拥有它?
我想在生产服务器上记录致命错误,以帮助解决仅在生产中发生的错误.我知道,开发服务器上的xdebug必须足够,但事实并非如此.也许我们可以使用xdebug激活最少的选项,或者使用它的剥离版本将堆栈跟踪添加到错误日志中?
<?PHP function shutdown() { $a=error_get_last(); if($a!==null) print_r($a); } register_shutdown_function('shutdown');
您不会在致命错误上获得堆栈跟踪,因为“FATAL”表示脚本执行立即停止,即无法通过常规通道生成跟踪.因此,如果您已设置自定义错误处理程序以抛出异常,则不会根据
PHP manual调用致命错误:
The following error types cannot be handled with a user defined
function: E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,
E_COMPILE_ERROR,E_COMPILE_WARNING,and most of E_STRICT raised in the
file where set_error_handler() is called.
获取有关致命错误(无法启用display_errors,生产环境中不是选项)的信息的最简单方法是在关机处理程序中自己手动构建错误信息.另外,我不会在生产服务器上使用xdebug …它用于调试开发环境,并会在生产环境中增加不必要的开销.
function shutdown() { if ( ! $err = error_get_last()) { return; } $fatals = array( E_USER_ERROR => 'Fatal Error',E_ERROR => 'Fatal Error',E_PARSE => 'Parse Error',E_CORE_ERROR => 'Core Error',E_CORE_WARNING => 'Core Warning',E_COMPILE_ERROR => 'Compile Error',E_COMPILE_WARNING => 'Compile Warning' ); if (isset($fatals[$err['type']])) { $msg = $fatals[$err['type']] . ': ' . $err['message'] . ' in '; $msg.= $err['file'] . ' on line ' . $err['line']; error_log($msg); } }