本来想自己写个 error 处理的 logger 结果发现通过 set_error_handler 没办法捕获到 fatal error & parse error 唉,真愁人呐。
在 php.net 上也没有找到办法,后来反到是在 zend.com 上找到了解决 catch fatal error 的办法就是在 auto_prepend_file 和 auto_append_file 上做手脚。
prepend 的文件里面有一个 string 里面是个 error page 的 html 包括一个 script 可以把错误信息发送到 server 的一个 api 上。
而在 append 的文件里通过 ob_get_contents() 来把那个 string 给去掉,如果能去掉就说明程序中间的执行流程正确,无错,如果有 fatal error 则没有办法到达 append 文件这步,所以会显示那个 html 页面。
方法还可以,但是因为每个 php 都要 prepend & append 可能效率会不行,和 Xuanyan 讨论了一小会暂时还是没有什么好办法来捕获 fatal & parse error 。
:(

我是这么干的:
php中的try {} catch {}或set_error_handler()都捕获不了fatal error, 必然导致程序终止,
虽然无法让程序继续执行, 但是仍然可以输出致命错误发生前的程序状态:
$ob_before=ob_list_handlers();
if (count($ob_before)>0)
{$doc_before=ob_get_contents();
ob_end_clean();
}
if (function_exists(‘handle_fatal’)==false)
{function handle_fatal($output_try)
{if (preg_match(“/<b>(.+?)\serror<\/b>:(.*?)<br/i”, $output_try, $match))
{return $GLOBALS['status'];
}
else
{return $output_try;
}
}
}
ob_start(‘handle_fatal’);
$GLOBALS['status']=’status’;
/*可能发生致命错误的地方:begin*/
echo $this->kk;
//echo 1/0;
/*可能发生致命错误的地方:end*/
$doc=ob_get_contents();
ob_end_clean();
if (count($ob_before)>0)
{ob_start($ob_before[0]);
echo $doc_before;
}
echo $doc;