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

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

Solutions Collecting From Web of "Как я могу остановить буферизацию вывода PHP из сообщений об ошибках?"

Исключения проходят через ob_start () shield

Если вы хотите остановить выполнение 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 в вашем случае), например:

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

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

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

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

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