5

好吧,现在我已经深入了一点,我意识到这是一个愚蠢的问题,而且是错误的。事实证明,我维护的遗留代码的作者正在使用一条php_init语句将错误日志劫持到另一个文件中。劫持发生在打开输出缓冲的同时,使得输出缓冲看起来好像在丢弃我的错误消息。

所以,版主先生,请随意删除此内容。感谢那些真诚回答的人。


给定以下 PHP 脚本:

<?php 
error_log('test'); 

ob_start();

error_log('test2');

ob_end_flush();
?>

我得到以下错误日志输出:

[04-Feb-2010 11:30:38] test

为什么输出缓冲会吃掉我的错误消息?我怎样才能让它停止?

或者,是否有另一种方法可以将消息从输出缓冲区中偷运出来,或者它只是一个黑洞?

(使用 PHP 5.2.4-2ubuntu5.10

4

2 回答 2

7

异常穿透 ob_start() 屏蔽

如果你想停止 PHP 脚本的执行,不如抛出一个Exception,它会穿透 ob_start(), ob_end_flush() 屏蔽

echo 'before output buffer';
ob_start();
throw new Exception('this will be seen');
ob_end_flush();

考虑创建一个 Logger 类

不要直接使用您的方法输出holder,而是使用包含日志(或您的情况下的方法)的类或 a error,例如:

class Logger
{
    private $_messages = array();

    public function __construct()
    {
        $this->_messages['errors'] = array();
        $this->_messages['debug'] = array();
    }

    public function error($msg)
    {
        $this->_messages['errors'][] = $msg;
    }

    public function debug($msg)
    {
        $this->_messages['debug'] = $msg;
    }

    public function getErrors()
    {
        return $this->_messages['errors'];
    }

}

$logger = new Logger();

$logger->error('error1');

ob_start();

$logger->error('error2');

ob_end_flush();

print_r($logger->getErrors());

这样您就可以依赖 holder 对象,它不会丢弃消息并获取您想要显示的所有错误

于 2010-02-04T17:51:56.047 回答
0

我在实践中从未这样做过,但这应该可行:

您必须围绕 error_log() 构建一个包装器

  1. 使用 ob_get_contents() 存储您正在缓冲的输出
  2. 使用 ob_clean() 擦除输出缓冲区
  3. 写出错误消息并 ob_flush()es 它
  4. 使用 echo() 写回存储的输出
于 2010-02-04T17:42:16.097 回答