У меня есть этот код:
<?php for($i = 0; $i<30; $i++) { echo "$i<br>"; usleep(100000); } ?>
Я хотел бы знать, как заставить браузер отображать 0, затем 1, затем 2, …
В моем примере он загружается некоторое время, а затем отображает 0-29.
Отключите всю выходную буферизацию и введите выходной сигнал:
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";
Не просите меня объяснить это, но это работает для меня.