最近线上项目偶尔会报500错误。虽然可以根据日志获取导致错误的请求参数,但还是需要自己模拟请求。更何况,因为等到你自己模拟请求的时候,导致错误的主体(比如同一个订单,同一个请求参数,当订单状态为3时会报错,但是当你去模拟一下,订单状态变成了4,此时不会报错)的状态发生了变化,所以需要保存出错时的上下文。于是发现CI有hook函数,终于有一个pre_systemhook可以满足要求:pre_system在系统执行初期被调用。这个时候只加载了benchmark类和hook类,还没有执行路由或者其他流程。具体使用方法如下:在hooks.php中添加$hook['pre_system'][]=array('class'=>'ErrorCatch','function'=>'errorCatchInit','filename'=>'对应工程ErrorCatch.php','filepath'=>'controllers/app',//这里不要加APPPATH);然后新建对应的类,最终的错误处理类如下:}publicstaticfunctionhandleShutdown(){//write_log();}}但是此时无法捕获错误日志,因为CI本身实现了一套register_shutdown_function,在core/Common.php的_error_handler方法中,有下面的代码//直接退出脚本}当有多个register_shutdown_function回调时,上一次退出后,不会触发后续回调,所以:在index.php中添加define('SELF_ERROR_SHUT_DOWN',1);然后if($is_error){退出;//直接退出脚本}改为if($is_error){if(defined('SELF_ERROR_SHUT_DOWN')){return;}exit;}此时可以统一收集程序错误,报出原文