У меня есть цикл, который занимает очень много времени, и я хочу, чтобы скрипт отображал что-либо всякий раз, когда выполняется итерация цикла.
echo "Hello!"; flush(); for($i = 0; $i < 10; $i ++) { echo $i; //5-10 sec execution time flush(); }
Это не отображает эхо, пока весь скрипт не будет завершен. Что пошло не так?
Из руководства PHP:
flush () не сможет переопределить схему буферизации вашего веб-сервера и не влияет на буферизацию на стороне клиента в браузере. Он также не влияет на механизм буферизации вывода пользовательского пространства PHP. Это означает, что вам придется вызывать оба ob_flush () и flush (), чтобы очистить выходные выходные буферы, если вы их используете.
echo "Hello!"; flush(); ob_flush(); for($i = 0; $i < 10; $i ++) { echo $i; //5-10 sec execution time flush(); ob_flush(); }
-или- вы можете сбросить и отключить буферизацию
<?php //Flush (send) the output buffer and turn off output buffering while (ob_get_level() > 0) ob_end_flush(); echo "Hello!"; for($i = 0; $i < 10; $i ++) { echo $i . "\r\n"; } ?>
попробуй это
while (@ob_end_flush()); ob_implicit_flush(true); echo "first line visible to the browser"; echo str_pad("",1024," "); echo "<br />"; sleep(5); echo "second line visible to the browser after 5 secs";
Просто обратите внимание, что таким образом вы фактически отключите выходной буфер для вашего текущего скрипта. Поэтому, если вы пытаетесь «ob_end_flush ()», после этого вы получите предупреждение о том, что буфер не закрывается.
Убедитесь, что вы сначала выполните:
@ini_set('zlib.output_compression', 0); @ini_set('implicit_flush', 1); @ob_end_clean();
а затем просто flush();
каждый раз, когда вам нужно вывести свои эхо-сигналы в браузер.
В общем, желаемое поведение невозможно, это детерминированный / стабильный способ использования чистого PHP и HTML.
Если и как браузер отображает частичную страницу, это зависит от браузера, прокси и кешей. Таким образом, даже если материал работает на вашем тестовом компьютере, вполне вероятно, что он не работает на вашей производственной системе.
Библиотека xAjax предоставляет хорошо интегрированное решение для управления обновлениями стиля AJAX с помощью PHP . Хотя xAjax может быть мертвым как проект (по крайней мере сейчас), он все равно работает нормально.
Вы можете попробовать также использовать ob_flush (), иногда оба они необходимы для работы.