如何停止PHP输出缓冲区吞噬错误信息?

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)
2个回答

7

异常穿透ob_start()屏障

如果你想停止PHP脚本执行,最好抛出一个异常,这样可以穿透ob_start()和ob_end_flush()的屏障。

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

考虑创建一个Logger类

不要直接输出,而是使用一个类或者holder来包含日志(或者在你的情况下使用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());

通过这种方式,您可以依赖于持有者对象,它不会丢弃消息并获取您想要显示的所有错误。


0

我从未在实践中尝试过这个,但这应该可以工作:

您需要在error_log()周围构建一个包装器,

  1. 使用ob_get_contents()存储您正在缓冲的输出
  2. 使用ob_clean()清除输出缓冲区
  3. 写出错误消息并使用ob_flush()刷新它
  4. 使用echo()写回存储的输出

这不是“我的”error_log函数,而是PHP的:http://www.php.net/manual/en/function.error-log.php - David Eyk
啊,好的。不过,总体观点还是没变。我稍微修改了我的回答。 - Pekka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接