【问题标题】:How do I stop PHP output buffering from eating error messages?如何阻止 PHP 输出缓冲吃错误消息?
【发布时间】:2011-01-13 04:43:17
【问题描述】:

好吧,既然我已经深入了一点,我意识到这是一个愚蠢的问题,而且是错误的。事实证明,我维护的遗留代码的作者正在使用 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

【问题讨论】:

    标签: php logging error-reporting output-buffering


    【解决方案1】:

    异常穿透 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(或您的情况下为 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 对象,它不会丢弃消息并获取您想要显示的所有错误

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      猜你喜欢
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多