How do I stop PHP output buffering from eating error messages?

不羁的心 提交于 2019-12-01 06:34:05

Exceptions penetrate ob_start() shield

If you want to stop PHP script execution, rather throw an Exception, which will penetrate the ob_start(), ob_end_flush() shield

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

Consider creating a Logger class

Don't output directly with your method, rather use a class or a holder which incorporates the log (or error method in your case), eg:

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

this way you can rely on the holder object, it will not discard messages and get all errors, that you wanted to display

I've never done this in practice, but this should work:

You would have to build a wrapper around error_log() that

  1. stores the output you are buffering using ob_get_contents()
  2. erases the output buffer using ob_clean()
  3. writes out the error message and ob_flush()es it
  4. writes back the stored output using echo()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!