如何阻止PHP输出缓冲吃掉错误消息?

时间:2010-02-04 17:37:42

标签: php logging error-reporting output-buffering

好吧,既然我已经进一步了解它,我意识到这是一个愚蠢的问题,而且错了。事实证明,我维护的遗留代码的作者将错误日志置于具有php_init语句的不同文件中。 hi-jacking在输出缓冲打开的同时发生,使其出现,好像输出缓冲丢失了我的错误消息。

所以,主持人,随便删除这个。感谢那些善意回答的人。


给出以下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 个答案:

答案 0 :(得分: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,例如:< / p>

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

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

答案 1 :(得分:0)

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

您必须围绕error_log()

构建一个包装器
  1. 使用ob_get_contents()
  2. 存储您正在缓冲的输出
  3. 使用ob_clean()
  4. 擦除输出缓冲区
  5. 写出错误消息,ob_flush()es it
  6. 使用echo()
  7. 回写存储的输出