ホームページ >バックエンド開発 >PHPチュートリアル >PHPのフラッシュ関数を使用する際の注意点
マニュアルで説明されている
Ob_flush/flush は両方とも出力バッファをフラッシュし、一緒に使用する必要があるため、多くの人を混乱させています...実際、これらは異なるオブジェクトに対して動作します
ob_*。一連の関数は PHP 自体の出力バッファーを操作します
したがって、ob_flush は PHP 自体のバッファーを更新します
そして、厳密に言えば、flush は Apache モジュール (ハンドラーまたはフィルター) としてのみ使用できます。
WebServerのバッファ(特にapacheを指すと考えられます)をリフレッシュするためです。
Apacheモジュールのsapiでは、sapi_moduleのflushメンバ関数ポインタを呼び出すことで間接的にflushが呼び出されます。 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画像をデータ/base64データストリームに変換するソースコードの詳細な説明
phpMicrosoft MSSQL (SQLサーバー)に接続するための戦略
以上がPHPのフラッシュ関数を使用する際の注意点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。