Как мне остановить выходную буферизацию PHP от появления сообщений об ошибках? - PullRequest
3 голосов
/ 04 февраля 2010

Ну, теперь, когда я немного углубился в это, я понимаю, что это глупый и неправильный вопрос. Оказывается, что автор устаревшего кода, который я поддерживаю, подсовывал журнал ошибок в другой файл с оператором 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 голосов
/ 04 февраля 2010

Исключения проникают через щит ob_start ()

Если вы хотите остановить выполнение PHP-скрипта, вместо этого бросьте Exception , которое проникнет через ob_start (), ob_end_flush () shield

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 голосов
/ 04 февраля 2010

Я никогда не делал этого на практике, но это должно работать:

Вы должны создать оболочку для error_log (), которая

  1. сохраняет вывод, который вы буферизуете, используя ob_get_contents ()
  2. стирает выходной буфер, используя ob_clean ()
  3. записывает сообщение об ошибке и ob_flush () делает его
  4. записывает сохраненный вывод с помощью echo ()
...