PHPのフラッシュ関数を使用する際の注意点

墨辰丷
リリース: 2023-03-29 08:04:01
オリジナル
1358 人が閲覧しました

マニュアルで説明されている

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(&#39;Content-Type: text/event-stream&#39;);
header(&#39;Cache-Control: no-cache&#39;);
// ob_end_flush();
// ini_set(&#39;output_buffering&#39;, 0);
// ini_set(&#39;implicit_flush&#39;, 1);
if (ob_get_level() == 0) ob_start();
echo str_repeat(&#39; &#39; ,4096);
$long = 60;
while($long > 0)
{
$time = date(&#39;r&#39;);
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(&#39;Content-Type: text/event-stream&#39;);
header(&#39;Cache-Control: no-cache&#39;);
header(&#39;X-Accel-Buffering: no&#39;);

// ob_end_flush();
// ini_set(&#39;output_buffering&#39;, 0);
// ini_set(&#39;implicit_flush&#39;, 1);

// if (ob_get_level() == 0) ob_start();
// echo str_repeat(&#39; &#39; ,4096);

$long = 60;
while($long > 0)
{
	$time = date(&#39;r&#39;);
	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のフラッシュ関数を使用する際の注意点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!