ホームページ >バックエンド開発 >PHPチュートリアル >PHP出力キャッシュに基づくoutput_buffering例の詳細な説明

PHP出力キャッシュに基づくoutput_buffering例の詳細な説明

伊谢尔伦
伊谢尔伦オリジナル
2017-06-24 13:35:191417ブラウズ

まず PHP の出力順序を明確にします

1. PHP 出力キャッシュをオンにします: echo,print -> ブラウザ バッファリング ->display 2 .php 出力キャッシュがオンになっていません:
echo,print -> サーバー バッファリング -> ブラウザ バッファリング -> ブラウザの出力キャッシュも明確にします: IE は 256 バイト、Chrome と FireFox は 1000 バイトです。データが到達すると、ブラウザはこの長さまたはスクリプトの終了後にのみページにデータを出力します
いくつかの PHP 設定と使用される API について話しましょう:
1.php.ini の output_buffering 設定
•Off: を意味します。 PHP 出力キャッシュをオフにする
•オン: 無限の出力キャッシュを開きます
•4096: サイズ 4096Byte の出力キャッシュを開きます


2.php.ini implicit_flush 設定

•オン: 各出力 (エコー、 print)flush() 関数を自動的に呼び出した後、直接出力します •Off: On とは対照的に、各出力後に flash() は呼び出されません。サーバーのバッファリングがいっぱいになるまで出力されませんが、有効にしていなくても問題ありません。より柔軟です

3.
ob_flush
() 関数: PHP のバッファリングからデータを取り出し、サーバーのバッファリングに置きます 4.flush() 関数: サーバーのバッファリングからデータを取り出し、ブラウザのバッファリングに入れます


5.
ob_start
() 関数: この関数については、今はあまり明確にはわかりません。これがオンになっていると、たとえ ob_flush() と flash() が使用されていても、出力は ob_flush() によって制御されません。現時点でわかっているのは、output_buffering=Off であっても、データをブラウザ上ですぐに出力できないということです。 ob_start()を使うと出力データはキャッシュできないし、output_buffering=Onだとob_start()を使わなくても出力データはPHPでもキャッシュできるので、ob_startは無駄だと思うので勝ちました今は気にしないでくださいそれではコードを見てみましょう(output_buffering=4096, implicit_flush=Offに設定)

<html>
     <body>
         <?php
             // ob_start();    //这玩意开了就会不正常,输出不受ob_flush()控制,不知道到底干嘛用
             // echo str_repeat(&#39; &#39; ,1000);    //IE缓存256Bytes
             echo str_repeat(&#39; &#39; ,1000);    //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
             for($i=0;$i<5;$i++) {
                 echo $i.&#39;<br />&#39;;
                 ob_flush();
                 flush();
                 sleep(1);
             }
         ?>
     </body>
 </html>

ここでのコードの出力は一行ずつ出力されており、具体的な原理は関数を参照してくださいこれら 2 つの関数のいずれかが欠落している場合、私の設定では、0、1、2、3、4 がキャッシュされ、最終的に一緒に出力されるまで待つ必要があります。 Laruence さんのブログ、皆様の理解の一助になれば幸いです

マニュアルの ob_flush/flush の説明は出力バッファをリフレッシュするものですが、併用する必要があるため、混乱を招く方も多いと思います…

実際、場合によっては、flush は PHP 自体の出力バッファを操作します
。そしてフラッシュは、厳密に言えば、PHP が Apache の モジュール

(ハンドラーまたはフィルター) としてインストールされている場合にのみ、Apache の

の下にある Web サーバーのバッファーを更新します。 module の場合、flush は、sapi_module のフラッシュ メンバー

関数ポインター

を呼び出すことで、間接的に Apache の API を呼び出します。 ap_rflush は、Apache の出力バッファを更新します。 もちろん、マニュアルには、Apache の他のモジュールもあるとも記載されています。このアクションの結果を変更します。

1. mod_gzip などの一部の Apache モジュールは、それ自体で出力キャッシュを実行する場合があります。

2. これにより、flush() 関数によって生成された結果がクライアントのブラウザーにすぐに送信されなくなります。

3.

4. ブラウザでも受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape

5. ブラウザは改行または HTML タグの先頭を受け取るまでコンテンツをキャッシュし、f16b1740fad44fb09bfe928bcc527e08 タグを受け取るまでテーブル全体は表示されません。 7. 8. Microsoft Internet Explorer の一部のバージョンは、256 バイトを受信した後でのみページの表示を開始するため、これらのブラウザーがページのコンテンツを表示できるようにするには、いくつかの追加のスペースを送信する必要があります。

したがって、この 2 つを使用する正しい順序は、最初に ob_flush、次にフラッシュです。

もちろん、他の sapi では、flush を呼び出すことはできませんが、コードの移植性を確保するために、これらを使用することをお勧めします。一緒に

以上がPHP出力キャッシュに基づくoutput_buffering例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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