Вывод промывки PHP, как только вы вызываете эхо

Я думал, flush(); будет работать, по крайней мере, из того, что скажет мне Google / Stackoverflow, но на моей системе Windows WAMP (Windows, Apache, MySQL, PHP) она не работает.

Есть ли какая-то настройка PHP, которую я должен настроить для работы flush ()?

Вот мой код:

 <?php echo "Fun"; flush(); sleep(5); echo "<br>Mo"; ?> 

Код просто выводит все вместе, когда скрипт выполняется (через 5 секунд). Я не хочу этого, я хочу, чтобы «Fun» появился сразу, а затем через 5 секунд «Mo».

Я пробовал другие комбинации flush как ob_end_flush(); or ob_implicit_flush(true); но ничего не работает. Есть идеи?

Скрипт отлично работает с CLI, отображая «Fun», ожидая 5 секунд перед отображением «Мо».

Для браузера результаты могут быть немного разными, потому что:

  1. Браузер не начнет рендеринг сразу. Получить 3 байта данных для HTML-документа недостаточно, чтобы сделать что-либо, поэтому он, скорее всего, ждет еще несколько.
  2. Неявная буферизация ввода-вывода на уровне lib, скорее всего, будет активна до получения новой строки.

Для работы 1) используйте тип текста / обычного контента для вашего теста; 2) нужны символы новой строки, так что echo "Fun\n"; и echo "<br>Mo\n"; Конечно, вы не будете использовать text / plain для реальных данных HTML.

Вот что я узнал:

Флеш не работал бы с помощью apache mod_gzip или gzip от Nginx, потому что, по логике, это gzipping содержимое, и для этого он должен буферизовать контент, чтобы его gzip. Любой вид gzipping веб-сервера повлияет на это. Короче говоря, на стороне сервера нам нужно отключить gzip и уменьшить размер буфера fastcgi. Так:

  • В php.ini:

    , output_buffering = Off

    , zlib.output_compression = Off

  • В nginx.conf:

    , gzip off;

    , proxy_buffering off;

Также имейте это в виду, особенно если у вас нет доступа к php.ini:

  • @ini_set ( 'zlib.output_compression', 0);

  • @ini_set ( 'implicit_flush', 1);

  • @ob_end_clean ();

  • set_time_limit (0);

Наконец, если у вас есть это, выполните приведенный ниже код:

  • ob_start ( 'ob_gzhandler');

  • ob_flush ();

Код проверки PHP:

 ob_implicit_flush(1); for($i=0; $i<10; $i++){ echo $i; //this is for the buffer achieve the minimum size in order to flush data echo str_repeat(' ',1024*64); sleep(1); } 

Если вы используете CGI / FastCGI, забудьте об этом! Они не реализуют флеш. У Web-сервера может быть собственный буфер.

Вы можете отключить всю буферизацию вывода в PHP с помощью следующей команды:

 ob_implicit_flush(); 

Если проблема не устранена, хотя вы явно задали

 implicit_flush = yes 

в вашем php.ini вы также можете установить

 output_buffering = off 

который сделал трюк в моем случае (после того, как потянул мои волосы на 4 + hrs)

Проверьте ваш php.ini для output_buffering .

Возможно, проблема здесь в Apache, которая также может иметь буферы …