9

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

  1. error_reporting()index.php文件中设置了覆盖文件中的任何php.ini内容
  2. system/codeigniter/CodeIgniter.php在using 中设置了一个错误处理程序set_error_handler- 此错误处理程序 ,_exception_handler位于system/codeigniter/Common.php
  3. _exception_handler函数忽略E_STRICT错误, show_php_error如果严重性是您的函数指定的严重性,则从 Exceptions 系统库调用该函数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');的控制器,处理程序不会被调用。

任何有关错误处理的建议将不胜感激,谢谢!

4

3 回答 3

5

现在这是一个相当大的争论:是否应该捕获致命错误。有人说它们是致命的,所以您不知道系统处于哪种情况,但我会选择“如果发生错误,请尝试进行清理”。为了捕获所有致命错误,您需要设置一个 pre_system 挂钩。转到 application/config/hooks.php 并输入

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

之后转到 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();
        }
    }

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

于 2013-02-15T20:45:37.203 回答
0

我在另一个问题(https://stackoverflow.com/a/3675357)下找到了这个答案,我认为它对任何阅读这个问题的人也很有用。“对于 codeigniter 特定的错误处理,您可以通过在 application/libraries 文件夹中创建My_Exception类来覆盖其 'Exception' 库类。将原始库函数签名复制到其中并放入您的代码中。它肯定会工作。”

于 2013-09-19T08:59:54.797 回答
0

简单地,您可以在一个文件中处理所有类型的错误,该文件由于 php 错误或任何其他错误不利于显示客户端而显示您的客户端。

只需将文件 Common_Exceptions.php 放在 core 文件夹中。Common 是我的,因为在配置文件中我声明了 $config['subclass_prefix'] = 'Common_';

复制 system\core\Exceptions.php 文件并粘贴到 core\Common_Excepions 文件中(Common_Exceptions 类扩展 CI_Exceptions)并在此文件中进行更改并根据需要调用视图并在错误出现时显示给客户端。

注意:$config['log_threshold'] = 1; 在配置文件中启用错误日志写入,并在您看到出现什么错误之后。

关于查看文件的另一个建议,即在出现错误时显示的位置时间,因此当您在日志中看到时,然后匹配这个时间并找到那个时间出现的错误

于 2020-10-08T07:20:55.137 回答