web-dev-qa-db-ja.com

PHP動作するフラッシュ... Nginxでも

ループが実行されるたびにエコーすることは可能ですか?例えば:

foreach(range(1,9) as $n){
    echo $n."\n";
    sleep(1);
}

ループが終了したときにすべてを出力するのではなく、時間ごとに各結果を出力することを確認します。

28
Roger

最終的解決

それが私が見つけたものです:

Flushは、Apacheのmod_gzipまたはNginxのgzipでは機能しません。これは、論理的にはコンテンツをgzipしているため、コンテンツをバッファーに入れてgzipする必要があるためです。あらゆる種類のWebサーバーgzippingがこれに影響します。つまり、サーバー側では、gzipを無効にし、fastcgiバッファーサイズを小さくする必要があります。そう:

  • Php.iniで:

    。 output_buffering = Off

    。 zlib.output_compression =オフ

  • Nginx.conf:

    。 gzipオフ;

    。 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);
}

関連:

33
Roger

Nginxのバッファリングを排除する最も簡単な方法は、ヘッダーを発行することです。

header('X-Accel-Buffering: no');

これにより、両方のproxy_bufferingおよび(nginx> = 1.5.6の場合)、fastcgi_buffering。 php-fpmを使用している場合、fastcgiビットは重要です。また、ヘッダーは必要に応じて実行する方がはるかに便利です。

X-Accel-Bufferingのドキュメントfastcgi_bufferingのドキュメント

34
Andy Fowler

Nginxサーバーでの簡単なソリューション:

fastcgi_keep_conn on; # < solution

proxy_buffering off;
gzip off;
25

サーバー全体またはディレクトリ全体でgzipをオフにする必要はありませんでした。いくつかの特定のケースでは、いくつかのスクリプトだけでした。

何かがエコーされる前に必要なのはこれだけです:

header('Content-Encoding: none;');

次に、通常どおりフラッシュを実行します。

ob_end_flush();
flush();

Nginxはオフになっているエンコーディングを取得するようで、gzipしません。

10
Redzarf

PHPのバッファをブラウザにフラッシュする必要があります

foreach(range(1,9) as $n){
    echo $n."\n";
    flush();
    sleep(1);
}

参照: http://php.net/manual/en/function.flush.php

5
Petah

あなたが設定できることがわかりました:

header("Content-Encoding:identity");

pHPスクリプトで、nginx.confを変更せずにnginx gzippingを無効にする

2
ttk

これは、ループの途中で出力バッファーをフラッシュすることで実現できます。

例:

ob_start();
foreach(range(1,9) as $n){
    echo $n."\n";
    ob_flush();
    flush();
    sleep(1);
}

Php.iniの設定は、zlib圧縮をオンにしている場合、これが機能するかどうかに影響する可能性があることに注意してください。

2
Andy Baird

私のphp-fpmエンジンからgzipの問題が発生しました。このコードは私のために働いている唯一のものです:

function myEchoFlush_init() {
    ini_set('zlib.output_compression', 0);
    ini_set('output_buffering', 'Off');
    ini_set('output_handler', '');
    ini_set('implicit_flush', 1);
    ob_implicit_flush(1);
    ob_end_clean();
    header('Content-Encoding: none;');

}

function myEchoFlush($str) {
    echo $str . str_repeat(' ', ini_get('output_buffering') * 4) . "<br>\n";
}

これは私のテスト関数です:max_execution_timeをチェックします:

public function timeOut($time = 1, $max = 0) {
    myEchoFlush_init();
    if ($max) ini_set('max_execution_time', $max);
    myEchoFlush("Starting infinite loop for $time seconds. It shouldn't exceed : " . (ini_get('max_execution_time')));
    $start = microtime(true);
    $lastTick = 1;
    while (true) {
        $tick = ceil(microtime(true) - $start);
        if ($tick > $lastTick) {
            myEchoFlush(microtime(true) - $start);
            $lastTick = $tick;
        }
        if ($tick > $time) break;
    }
    echo "OK";
}
1
Nicolas Thery