CodeIgniter中error_get_last函数失效问题求助
解决CodeIgniter中pre_system钩子里error_get_last()失效的问题
我来帮你搞定这个问题!你遇到的error_get_last()在CodeIgniter pre_system钩子中不工作的情况,通常和钩子配置、函数作用域或者CodeIgniter的错误处理机制有关,下面是具体的排查和修复步骤:
1. 先确认钩子配置是否正确
首先要确保你的钩子已经被CodeIgniter正确加载:
- 打开
application/config/hooks.php,确认已经启用钩子:$config['enable_hooks'] = TRUE; - 确认钩子的注册代码正确,比如:
注意$hook['pre_system'][] = array( 'class' => 'PHPFatalError', 'function' => 'setHandler', 'filename' => 'PHPFatalError.php', 'filepath' => 'hooks', 'params' => array() );filepath是你的钩子类文件所在的目录(默认是application/hooks/),文件名和类名要完全一致。
2. 修复shutdown函数的作用域问题
你原来的写法把handleShutdown()放在类外部,在CodeIgniter的环境中可能会因为作用域问题无法正常执行。建议把它改成类的成员方法,用类实例作为回调:
修改你的PHPFatalError.php文件:
<?php class PHPFatalError { public function setHandler() { // 使用类方法作为shutdown回调,确保作用域正确 register_shutdown_function(array($this, 'handleShutdown')); } public function handleShutdown() { $lastError = error_get_last(); // 只捕获致命错误,避免非致命错误干扰结果 if ($lastError && in_array($lastError['type'], [ E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING ])) { echo '<pre>'; print_r($lastError); echo '</pre>'; // 这里还可以扩展:记录错误日志、跳转自定义错误页面等 } } }
3. 调整CodeIgniter的错误级别设置
CodeIgniter默认可能会抑制部分错误输出,导致error_get_last()无法捕获到错误:
- 打开
application/config/config.php,确保日志级别足够:$config['log_threshold'] = 1; // 至少设置为1,记录错误级别的日志 - 在项目根目录的
index.php中,临时开启错误显示(仅用于调试,线上环境记得关闭):error_reporting(E_ALL); ini_set('display_errors', 1);
4. 用正确的场景测试
要验证功能,需要触发一个真正的致命错误,比如在控制器里写一行错误代码:
// 在某个控制器的方法中调用不存在的函数 $this->nonExistentFunction();
注意:如果是脚本语法错误(比如少写分号),PHP会在CodeIgniter加载钩子之前就终止执行,这种情况shutdown函数仍然能捕获,但要确保你的钩子类文件本身没有语法错误。
总结
按照上面的步骤调整后,error_get_last()应该就能正常捕获致命错误了。核心是确保钩子配置正确,回调函数在正确的作用域内,同时让PHP允许错误被捕获。
内容的提问来源于stack exchange,提问作者VJ.
相关产品推荐
相关产品推荐

