You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:32:32