ob_flush/flush はマニュアルでは出力バッファのフラッシュとして説明されており、これも併用する必要があるため、多くの人に混乱を引き起こすでしょう...実際、場合によっては、これらは異なるオブジェクトに対して動作します。
ob_* 一連の関数は PHP 自体の出力バッファを操作します
つまり、ob_flush は PHP 自身のバッファを更新します
、厳密に言えば、これは Apache のモジュールとしてのみ使用できます。 (ハンドラー) またはフィルター) がインストールされていると、実際に効果があります。
WebServer のバッファー (特に Apache を参照していると考えられます) をリフレッシュします。
Apache モジュールの sapi の下で、flush はフラッシュ メンバーを呼び出します。 sapi_module の関数ポインタ、Apache API を間接的に呼び出す: ap_rflush は Apache の出力バッファを更新します。もちろん、マニュアルには、Apache の他のモジュールもあり、このアクションの結果が変わる可能性があるとも書かれています。 mod_gzip などの一部の Apache モジュールでは、出力キャッシュを自分で実行することができます。これにより、flush() 関数によって生成された結果がクライアント ブラウザにすぐに送信されなくなります。
ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは、改行または html タグの先頭を受信するまでコンテンツをキャッシュし、 タグを受信するまでテーブル全体を表示しません。
Microsoft Internet Explorer
の一部のバージョンは、256 バイトを受信した後にのみページの表示を開始するため、これらのブラウザーがページのコンテンツを表示できるようにするには、追加のスペースを送信する必要があります。 したがって、この 2 つを使用する正しい順序は、最初に ob_flush、次にフラッシュです。
もちろん、他の SAPI では、flush を呼び出すことはできませんが、コードの移植性を確保するために、次を使用することをお勧めします。
<?php // set_time_limit(0); header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); // ob_end_flush(); // ini_set('output_buffering', 0); // ini_set('implicit_flush', 1); if (ob_get_level() == 0) ob_start(); echo str_repeat(' ' ,4096); $long = 60; while($long > 0) { $time = date('r'); echo "data: The server time is: {$time}\n\n"; ob_flush(); flush();//break; sleep(1); $long --; } // var source=new EventSource("http://localhost:18000/sse.php");source.onmessage=function(event){console.info(event.data)}; ?>
nginx + fpm + php をサポートしたい場合は、応答ヘッダーを追加する必要があります
header('X-Accel-Buffering: no');
これにより、proxy_buffering と (nginx を使用している場合) の両方が排除されます>= 1.5.6)、fastcgi_buffering。php-fpm を使用している場合、fastcgi ビットは必要に応じて実行すると非常に便利です。X-Accel-Buffering のドキュメント: //nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_buffering ;
<?php // set_time_limit(0); header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); header('X-Accel-Buffering: no'); // ob_end_flush(); // ini_set('output_buffering', 0); // ini_set('implicit_flush', 1); // if (ob_get_level() == 0) ob_start(); // echo str_repeat(' ' ,4096); $long = 60; while($long > 0) { $time = date('r'); echo "data: The server time is: {$time}\n\n"; ob_flush(); flush();//break; sleep(1); $long --; } // var source=new EventSource("http://localhost:18000/sse.php");source.onmessage=function(event){console.info(event.data)}; ?>
以上がphpのflush()関数を使用する際の注意点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。