Я использую 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 " "; echo " "; echo " "; echo " "; echo " "; echo " "; echo " "; echo " "; echo " "; echo " "; echo " "; echo " "; echo " "; echo " "; 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: Поскольку первый не работал, это лучшее, что я могу предложить: как эхо выводить в реальном времени (до завершения скрипта)?