ホームページ >バックエンド開発 >PHPチュートリアル >PHPのフラッシュ関数を使用する際の注意点
ob_* 一連の関数は PHP 自体の出力バッファーを操作します
したがって、ob_flush は PHP 自身のバッファーを更新します
そして、厳密に言えば、flush は Apache モジュール (ハンドラーまたはフィルター) としてのみ使用できます。実際の効果はインストール時のみです。
WebServerのバッファ(特にApacheを参照していると考えられます)をリフレッシュします。
Apacheモジュールのsapiでは、flushメンバー関数ポインタを呼び出すことで間接的にflushが呼び出されます。 sapi_module の Apache の API: ap_rflush は Apache の出力バッファをリフレッシュします もちろん、マニュアルには、このアクションの結果を変更する可能性のある 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 を使用している場合、ヘッダーも必要に応じて実行すると非常に便利です。X-Accel のドキュメント。 -バッファリング http://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 のフラッシュ関数を使用する際の注意事項については、PHP の中国語 Web サイトを参照してください。