вывод процесса печати в режиме реального времени

Я использую PHP 5.3.4 с Apache 2.2.17 в системе Windows 7 x64. Я хотел бы, чтобы моя страница PHP выводила результат system вызова в режиме реального времени в браузер пользователя. С этой целью я сконфигурировал output_buffering=Off в php.ini и создал этот код:

 <?php ob_implicit_flush(true); ob_end_flush(); system('ping -n 10 www.google.com'); ?> 

Результат пинга печатается в режиме реального времени, но я также получаю диагностическую ошибку PHP и столбец в верхней части моей страницы, который гласит:

 Notice: ob_end_flush() [ref.outcontrol]: failed to delete and flush buffer. No buffer to delete or flush in index.php on line 3 

Что мне нужно сделать, чтобы исправить или подавить эту ошибку?

Обновление Если я меняю ob_end_flush() на $a = 1/0; Я получаю аналогичную ошибку, а выход – в реальном времени во всех браузерах. Это что-то о том, как печатается исключение, что заставляет это работать?

некоторые веб- браузеры буферизуют первые x байты, прежде чем они начнут отображать страницу при определенных условиях.

попробуйте сначала вывести много пробелов

У меня есть решение, которое работает, но оно неэффективно и нехорошо . Я бросаю исключение, но скрываю диалог исключения.

 <?php ob_implicit_flush(true); // Something about the way exceptions are thrown causes Firefox and Chrome // to be able to display the results of the system call in real-time rather // than having to wait for the call to complete. So, I just hide the // exception message. IE9 works with or without this. echo "<div style=\"display:none\">"; $a = 1/0; echo "</div>"; echo "<pre>"; system('ping -n 5 www.google.com'); echo "</pre>"; ?> 

Чтобы автоматически прокрутить страницу до конца, я добавлю несколько javascript:

 <html><head> <script language="javascript"> var int = self.setInterval("window.scrollBy(0,1000);", 200); </script> </head> <body> <?php // insert above php code here // stop scrolling when the execution finishes echo '<script language="javascript">int = window.clearInterval(int);</script>'; ?> </body> </html> 

РЕДАКТИРОВАТЬ

@ Ответ Криса показывает гораздо лучшее решение.

 echo '<div style="display:none">'; for ($a = 0; $a < 768; $a++) echo ' '; echo '</div>'; 

Просто добавьте это, чтобы очистить буфер:

  if (eregi("chrome",$_SERVER['HTTP_USER_AGENT'])) { echo "<div style=\"display:none\">"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; echo "</div>"; } 

Он должен быть внутри цикла. или между двумя выходами, которые нужно отображать в режиме реального времени.

И вот краткий трюк:

Добавь это:

 if (eregi("chrome",$_SERVER['HTTP_USER_AGENT'])) { echo "<div style=\"display:none\"></div>"; } 

ob_end_flush () очищает буфер вывода php и требует активного буфера вывода, созданного с помощью ob_start ().

Я думаю, вы просто хотите вызвать flush (), чтобы отправить данные клиенту.

 <?php ob_implicit_flush(true); flush(); system('ping -n 10 www.google.com'); ?> 

В вашем коде ошибка довольно легко интерпретировать.

Вы вызываете ob_end_flush() в строке 3, но (как говорит ошибка), нет выхода для очистки. По сути, строка 3 бесполезна, потому что никакой вывод не отправлен, поэтому удаление строки исправит ошибку. Если это включено в более крупный файл, вам может потребоваться сохранить ob_end_flush() поскольку некоторые данные могут быть уже захвачены.

РЕДАКТИРОВАТЬ: так как вам нужно очистить его, либо:

a: добавить ob_start(); в верхней части файла.

b: заменить ob_end_flush(); с flush();

EDIT2: Поскольку первый не работал, это лучшее, что я могу предложить: как эхо выводить в реальном времени (до завершения скрипта)?