Привет, пожалуйста, посмотрите ниже код:
<?php ob_start(); echo "Start ...<br />\n"; for( $i = 0 ; $i < 10 ; $i++ ) { echo "$i<br />\n"; ob_flush(); flush(); sleep(1); } echo "End ...<br />\n"; ?>
Это неверно? Я тестировал его, но мой вывод показывает, когда сценарий завершен, есть ли какое-либо решение?
Эй, человек, я тоже застрял в этой проблеме и, наконец, получил правильное решение здесь, это для тебя
вам нужно добавить тип контента для своей страницы, вы можете сделать это двумя способами: 1. используя html-тег
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Ex.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Wp Migration</title> </head> <body> <?php for($i=0;$i<70;$i++) { echo 'printing...<br>'; ob_flush(); flush(); sleep(3); } ?> </body> </html>
использование функции заголовка php
<?php header( 'Content-type: text/html; charset=utf-8' ); ?>
Ex.
<?php header( 'Content-type: text/html; charset=utf-8' ); for($i=0;$i<70;$i++) { echo 'printing...<br>'; ob_flush(); flush(); sleep(3); } ?>
Всего наилучшего
Некоторые браузеры должны получать не менее 256 символов, прежде чем они начнут рендеринг. Вы уже пытались добавить больше информации, например:
echo str_repeat(' ', 50) . "$i<br />\n";
EDIT :
В Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9
Я смог воспроизвести проблему ОП, установив
zlib.output_compression = On
Выключение его снова
zlib.output_compression = Off
заставил скрипт работать как нужно.
Попробуйте удалить вызов ob_start()
в первой строке: вам не нужно включать буферизацию вывода – и это, вероятно, вызывает проблемы.
Я проверил ваш код:
ob_start()
вызывается в первой строке, я вижу только результат, когда скрипт заканчивается, через 10 секунд ob_start()
, я вижу каждую строку вывода каждую секунду, как только она отображается на стандартном выходе. Используя Chrome, я обнаружил, что для обхода буфера браузера требуется большее количество байтов. В моем случае 4096 байт были в порядке:
echo str_repeat(' ', 4096);
Кроме того, добавление некоторого элемента HTML в начале также казалось обязательным:
echo $content . '<br />';
В моей системе кажется, что для FF4 требуется более 256 байтов, чтобы начать рендеринг того, что приходит с серверной стороны, а затем я решил с этим в начале:
while (@ob_end_flush()); echo(str_repeat(' ',1024)); // ...etc...
Я обнаружил, что это связано с тем, что сжатие gzip Apache используется для моего случая.
Чтобы отключить gzip только для сценария «промывки», я создал новый файл .htaccess
в каталоге, где находится непрерывный выходной скрипт, со следующим:
<IfModule mod_env.c> SetEnv no-gzip 1 </IfModule>
Повторное промывание снова работает.
Для людей, использующих FCGI / fast cgi.
FcgidOutputBufferSize 0
Верно. Работает отлично для меня с CLI с PHP 5.3.3. Если он не работает для вас, ваша установка PHP может отключить буферизацию вывода.
Я также предложил бы положить ob_end_flush () в конец вашего скрипта, чтобы закрыть выходной буфер.
Один непростой вопрос с IE8 и flush (); что если вы «вымываете» строки в таблице. IE будет отображать только таблицы, когда они будут завершены. Это была моя проблема, и изменение контейнеров из строк таблицы в divs решило проблему.
Вам нужно добавить файл .htaccess
для отключения вывода gzip
<IfModule mod_env.c> SetEnv no-gzip 1 </IfModule>
Я использую laravel framework, и буферизация не работает, но. Это решение:
header( 'Content-type: text/html; charset=utf-8' ); ob_start(); ob_end_flush(); ob_flush(); flush(); for($i = 1;$i<= 5;$i++){ echo $i; ob_flush(); flush(); sleep(3); }
Вы должны использовать первый ob_end_flush ();
Этот поток также работает с Laravel
ob_implicit_flush(true); echo "Processing ... "; // Or give out JSON output ob_flush(); sleep(5); //A time-consuming synchronous process (SMTP mail, maybe?) echo "Done";