1

嗯......这是我的情况:我正在开发一个框架,我目前正在开发错误处理功能。我也想处理错误处理错误!好吧......更好地解释:如果我有一个错误,无论是否致命,都会引发异常(在非致命错误的情况下)并伪造 Exception 用于致命错误。异常由“记录器”处理,它可以处理错误在控制台(浏览器)上回显或将其存储在文件中。问题是当记录器内发生第二个致命错误时。为了捕捉它,我使用了 PHP 缓冲区 (ob_start())。在这个函数内部不应该发生错误,任何人......换句话说......这是错误跟踪的最后一级。我可以只回显错误,但我想使用 PHP 错误日志系统注册它们(如果没有达到最后一级则禁用)。这可以使用 error_log 函数来实现。

“成功时返回 TRUE,失败时返回 FALSE。”

嗯……这就是我需要的。但我很害怕,因为我不知道这个函数是否会产生致命错误(内部实现)或者只是返回 TRUE/FALSE。我在 localhost SMTP 中使用邮件选项 (1) 进行了测试,但失败了(正如预期的那样!),生成了一条警告消息。然后缓冲区崩溃在浏览器上显示空白页面(这是我不希望发生的)。这个问题可以通过使用 fsockopen 检查 smtp 连接并将返回值归因于类变量来解决。在缓冲函数内部,这个变量值被验证。如果为 TRUE,则调用带有电子邮件选项的 error_log。但是对于带有选项 0(php 文件日志)和 3(其他文件)的 error_log?

这是我的日志记录类的相关部分:

    public function error_buffer($buffer) {

        $error = error_get_last ();

        if ($error && ($error ['type'] & E_FATAL && $this->_errhe)) {

            $this->error_handler_error ( $error ['type'], $error ['message'], $error ['file'], $error ['line'] );

            if (ENV === 'production') {
                return 'error 500';
            }

            return ob_get_contents ();

        }

        return $buffer;

    }

    public function error_handler_error($errno, $errmsg, $errfile, $errline) {

            var_dump ( $errfile );

            /* GENERATES WARNING MESSAGE... AND BLANK PAGE! 
             *  Here is possible to do: if($this->_email) { error_log() }...
            */
            @error_log ( $errmsg, 1, 'lucas@lucas.com' );

            // error_log($errmsg, 0);

    }
4

1 回答 1

2

@ 不会阻止错误的发生,它只会阻止它被显示。因此,如果 mail() 失败,则 error_log 到电子邮件(选项 1)也将失败 - 出现错误。

因此,可能发生的事情是 error_log() 调用会导致调用错误处理函数的错误,调用 error_log() 会导致调用错误处理函数的错误,调用 error_log() 会导致调用错误的错误错误处理函数,它调用 error_log() 导致错误......你明白了要点。

如果是这样的话,我能很快想到的解决方案是:

1 - 在 error_buffer 中包含一个静态变量来表示“我当前正在处理一个错误,不要再处理了(或者只是在屏幕上显示消息 - 但尊重 ini 设置“display_errors”)。

2 - 在你的错误函数中关闭你的错误处理以默认 PHP 函数处理它。

为什么不调用“error_log ($errmsg, 1, 'lucas@lucas.com');” 在错误函数之外(我们没有@),看看你的错误处理程序是否被调用?

于 2012-05-16T01:34:00.783 回答