PHP error_log函数可以在缓冲区内生成致命错误吗?

时间:2012-05-16 00:40:21

标签: php logging error-handling buffer ob-start

嗯......这是我的情况:我正在开发一个框架,我正在开发错误处理功能。我也想要处理错误处理错误!嗯...解释得更好:如果我有错误,致命或不致,会抛出异常(如果是非致命错误)和伪造的致命错误异常。异常由“记录器”处理,它可以在控制台(浏览器)上处理错误回显或将其存储在文件中。问题是在记录器内发生第二次FATAL错误。为了捕获它我正在使用PHP缓冲区(ob_start())。在这个函数里面永远不会出现错误,任何人....换句话说......这是错误跟踪的最后一个级别。我可以回应错误,但我想使用PHP错误日志系统注册它们(如果没有达到最后一级则禁用)。这可以使用error_log函数。在用于error_log函数的PHP文档中:

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

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

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

    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);

    }

1 个答案:

答案 0 :(得分:2)

@不会因为hapenning而停止错误,只会阻止它显示。因此,如果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');”在错误函数之外(我们没有@)并查看是否正在调用错误处理程序?