Вызов ob_flush() и flush(), но браузер не показывает какой-либо вывод до тех пор, пока script не закончит
Привет
Пожалуйста, смотрите ниже:
<?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";
?>
Неправильно? Я тестировал его, но мой вывод показывает, когда выполняется script, есть ли какое-либо решение?
Ответы
Ответ 1
Эй, я тоже застрял в этой проблеме
и, наконец, получил правильное решение
здесь это для вас
вам нужно добавить тип контента для своей страницы
вы можете сделать это двумя способами
1. использование html-тега
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Исх.
<!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
header( 'Content-type: text/html; charset=utf-8' );
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>
Все лучшее
Ответ 2
Некоторые браузеры должны получить не менее 256 символов, прежде чем они начнут рендеринг. Вы уже пытались добавить больше результатов, например:
echo str_repeat(' ', 50) . "$i<br />\n";
ИЗМЕНИТЬ:
В Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9
я смог воспроизвести проблему OP, установив
zlib.output_compression = On
Выключение снова
zlib.output_compression = Off
сделал работу script по желанию.
Ответ 3
Попробуйте удалить вызов ob_start()
в своей первой строке: вам не нужно включать буферизацию вывода - и это, вероятно, вызывает проблемы здесь.
Я проверил ваш код:
- Если
ob_start()
вызывается в первой строке, я вижу только вывод, когда script заканчивается через 10 секунд
- Если я удалю этот вызов на
ob_start()
, тогда я вижу одну строку вывода каждую секунду, как только она отображается на стандартном выходе.
Ответ 4
Используя Chrome, я выяснил, что для обхода буфера браузера требуется больше байтов. В моем случае 4096 байт были в порядке:
echo str_repeat(' ', 4096);
Кроме того, добавление некоторого элемента HTML в начале также казалось обязательным:
echo $content . '<br />';
Ответ 5
В моей системе кажется, что для начала рендеринга того, что поступает с сервера, для FF4 требуется более 256 байт, тогда я решил с этим в начале:
while (@ob_end_flush());
echo(str_repeat(' ',1024));
// ...etc...
Ответ 6
Я обнаружил, что это связано с тем, что сжатие Apache gzip используется для моего случая.
Чтобы отключить gzip только для "промывки" script, я создал новый файл .htaccess
в каталоге, где находится непрерывный вывод script, со следующим:
<IfModule mod_env.c>
SetEnv no-gzip 1
</IfModule>
Промывка снова работает как ожидалось.
Ответ 7
Для людей, использующих FCGI/fast cgi.
FcgidOutputBufferSize 0
Ответ 8
Это правильно. Работает отлично для меня с CLI с PHP 5.3.3. Если он не работает для вас, ваша установка PHP может отключить буферизацию вывода.
Я также предложил бы положить ob_end_flush() в конец вашего script, чтобы закрыть выходной буфер.
Ответ 9
Одна непростая проблема с IE8 и flush(); что если вы "вымываете" строки в таблице. IE будет отображать только таблицы, когда они будут завершены. Это была моя проблема, и изменение контейнеров из строк таблицы в divs решило проблему.
Ответ 10
Вам нужно добавить файл .htaccess
для отключения вывода gzip
<IfModule mod_env.c>
SetEnv no-gzip 1
</IfModule>
Ответ 11
Я использую 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();
Ответ 12
Этот поток также работает с 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";