PHP сбрасывает вывод, как только вы вызываете echo - PullRequest
0 голосов
/ 14 августа 2010

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

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

Вот мой код:

<?php
echo "Fun";

flush();

sleep(5);

echo "<br>Mo";
?>

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

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

Ответы [ 6 ]

7 голосов
/ 12 февраля 2011

Итак, вот что я обнаружил:

Flush не будет работать под mod_gzip Apache или gzip Nginx, потому что, по логике вещей, он распаковывает содержимое, и для этого он должен буферизовать содержимое, чтобы распаковать его.Любой вид взлома веб-сервера может повлиять на это.Короче говоря, на стороне сервера нам нужно отключить 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);
}
5 голосов
/ 14 августа 2010

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

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

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

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

3 голосов
/ 14 августа 2010

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

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

ob_implicit_flush();
1 голос
/ 22 января 2011

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

implicit_flush = yes 

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

output_buffering = off

, что и помогло в моем случае (после того, как потянул меня за волосы в течение 4 + часов)

0 голосов
/ 14 августа 2010

Может быть, проблема в Apache, который также может иметь буферы ...

0 голосов
/ 14 августа 2010

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

...