codeigniter中的错误处理

tro*_*roy 9 php codeigniter

在我捕获所有PHP错误的项目中,我已经设置了我的错误处理机制,如下所示:

  1. 我已经设置error_reporting()index.php文件,该文件将覆盖任何东西的php.ini文件
  2. 错误处理程序中设置system/codeigniter/CodeIgniter.php使用 set_error_handler-这个错误处理程序,_exception_handler在被发现system/codeigniter/Common.php
  3. _exception_handler函数忽略E_STRICT错误,调用 show_php_error如果你指定的严重性功能从异常系统库error_reporting()中的函数 index.php根据不管你已经在你的设置和记录错误config.php文件
  4. 处理程序返回FALSE后,PHP继续处理错误,但通常会根据您的error_reporting级别和display_errors设置.

令我困惑的是,E_ERROR错误即致命错误似乎根本没有被抓住_exception_handler.这不仅仅是show_php_error没有被调用,看起来这个函数并没有被调用.这显然是一个问题,因为这意味着它们不会被处理show_php_error或记录.例如,如果我故意$this->load->views('foo');在控制器中输入错误,则不会调用处理程序.

任何关于错误处理的建议都将非常感谢,谢谢!

tix*_*ix3 5

现在这是一个相当大的争论:你是否应该抓住致命的错误.有人说它们是致命的,所以你不知道系统在哪种条件下,但我会选择"如果发生错误就尝试清理".为了捕获所有致命错误,您需要设置pre_system挂钩.转到application/config/hooks.php并输入

$hook['pre_system'][] = array(
'class' => 'PHPFatalError',
'function' => 'setHandler',
'filename' => 'PHPFatalError.php',
'filepath' => 'hooks'
);
Run Code Online (Sandbox Code Playgroud)

之后转到hooks目录并添加您对错误的处理:

<?php
    class PHPFatalError {

    public function setHandler() {
            register_shutdown_function('handleShutdown');
        }

    }

    function handleShutdown() {
        if (($error = error_get_last())) {
            ob_start();
                echo "<pre>";
            var_dump($error);
                echo "</pre>";
            $message = ob_get_clean();
            sendEmail($message);
            ob_start();
            echo '{"status":"error","message":"Internal application error!"}';
            ob_flush();
            exit();
        }
    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我们正在使用register_shutdown_function来运行一个函数,该函数检查是否发生了错误,以及是否已通过电子邮件将其发送给开发人员.这个设置在我一直与之合作的几个CI项目中完美地工作了两年多.