20

次のようなコードがあります。

<?php
    ob_implicit_flush(true);
    ob_end_flush();

    foreach ($arrayOfStrings as $string) {
        echo time_expensive_function($string);
    }
?>

Apache では、これにより各エコーが出力されたときにブラウザに送信されます。ただし、nginx/FastCGI では、nginx の動作方法 (デフォルト) が原因で、これは機能しません。

これを nginx/FastCGI で動作させることは可能ですか?

4

6 に答える 6

5

簡単な解決策:

fastcgi_keep_conn on; # < solution

proxy_buffering off;
gzip off;
于 2012-11-30T09:28:43.353 に答える
3

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

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

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

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

ob_end_flush();
flush();

Nginx はエンコーディングがオフになっていることを認識しているようで、gzip を実行しません。

于 2013-06-27T10:13:36.687 に答える
0

ループに flush() 関数を追加します。

foreach ($arrayOfStrings as $string) {
  echo time_expensive_function($string);
  flush();
}

それはうまくいくかもしれませんが、必ずしも反復ごとにうまくいくとは限りません (いくつかの魔法が関係しています!)

于 2012-08-28T19:20:42.840 に答える
0

スクリプトの最初に、次の 2 行の両方が必要でした。

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

各行だけでも機能し、それらを組み合わせることで、ブラウザーがサーバーから結果を取得する速度がさらに速くなります。それを説明することはできません、ただ経験しただけです。

私の構成は、php-fpmを使用したnginxです。

于 2019-09-19T11:06:46.010 に答える