ホームページ  >  記事  >  バックエンド開発  >  PHPのフラッシュ関数を使用する際の注意点

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

高洛峰
高洛峰オリジナル
2016-12-22 16:27:331197ブラウズ

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(&#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 を使用している場合、ヘッダーも必要に応じて実行すると非常に便利です。

X-Accel のドキュメント。 -バッファリング http://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 のフラッシュ関数を使用する際の注意事項については、PHP の中国語 Web サイトを参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。