Вызов ob_flush () и flush (), но браузер не показывает какой-либо вывод до завершения скрипта

Привет, пожалуйста, посмотрите ниже код:

<?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> 
  1. использование функции заголовка 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('&nbsp;', 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";