Как остановить буферизацию вывода PHP от употребления сообщений об ошибках?

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


person David Eyk    schedule 04.02.2010    source источник


Ответы (2)


Исключения пробивают защиту 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());

таким образом, вы можете положиться на объект держателя, он не будет отбрасывать сообщения и получать все ошибки, которые вы хотели отобразить

person Juraj Blahunka    schedule 04.02.2010

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

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

  1. сохраняет вывод, который вы буферизуете, используя ob_get_contents()
  2. стирает буфер вывода с помощью ob_clean()
  3. выводит сообщение об ошибке и выполняет ob_flush()
  4. записывает сохраненный вывод, используя echo()
person Pekka    schedule 04.02.2010
comment
Это не моя функция error_log, это функция PHP: php.net/manual/en/function.error-log.php - person David Eyk; 04.02.2010
comment
Ах, хорошо. Тем не менее, общая точка остается в силе. Я немного отредактировал свой ответ. - person Pekka; 04.02.2010