Отображать вывод в частях на PHP

У меня есть этот код:

<?php for($i = 0; $i<30; $i++) { echo "$i<br>"; usleep(100000); } ?> 

Я хотел бы знать, как заставить браузер отображать 0, затем 1, затем 2, …

В моем примере он загружается некоторое время, а затем отображает 0-29.

Solutions Collecting From Web of "Отображать вывод в частях на PHP"

Отключите всю выходную буферизацию и введите выходной сигнал:

 while(@ob_get_clean()); for($i = 0; $i<30; $i++) { echo str_pad("$i<br>",4096); usleep(100000); } в while(@ob_get_clean()); for($i = 0; $i<30; $i++) { echo str_pad("$i<br>",4096); usleep(100000); } 

Кроме того, это не сработает, если ваш Apache использует mod_deflate и у вас есть gzip-compression для text/html файлов.

Сбросьте выходной буфер вручную:

 <?php ob_start(); for($i = 0; $i<30; $i++) { echo "$i<br>"; ob_flush(); usleep(100000); } ?> 

Используйте javascript. HTML не является интерактивной консолью.

EDIT: Те из вас, кто задумывается, помните, что я предлагаю фактическое рабочее решение. Инкрементальный вывод из php никоим образом не является действительным решением здесь, потому что есть несколько мест на пути, по которым он может получить буферизацию, и браузеры никоим образом не обязаны визуализировать html по мере того, как он приходит.

Другой, возможно, более быстрый способ сделать

 <?php ob_implicit_flush(true); ?> 

чтобы сообщить php сбросить выходной буфер после каждого выхода, а не в конец обрабатываемого файла.

По моему опыту нет надежного способа заставить веб-страницу отправлять выходные данные в реальном времени.

Есть много разных мест, где это может пойти не так – и, хотя вы можете легко заставить его работать в одной ситуации, всегда будут другие места, где решение не работает.

В конечном итоге единственным надежным решением является выполнение вашего php-кода из командной строки (через SSH или что-то еще) и полностью обход apache и веб-браузеров.

 <?php header('Content-type: text/html; charset=utf-8'); @ini_set('zlib.output_compression',0); @ini_set('implicit_flush',1); @ob_end_clean(); set_time_limit(0); echo "Yes"; sleep(5); echo " sir"; 

Не просите меня объяснить это, но это работает для меня.