Подтвердить что ты не робот

Вызов 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, есть ли какое-либо решение?

4b9b3361

Ответ 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

    <?php header( 'Content-type: text/html; charset=utf-8' ); ?>

Исх.

<?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('&nbsp;', 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";