buffer はメモリ アドレス空間で、Linux システムのデフォルト サイズは通常 4096 (4kb) です。主に、速度が同期していないデバイス間や優先度の異なるデバイス間のデータ転送領域を格納するために使用されます。
バッファを使用すると、プロセス間の待ち時間を短縮できます。
たとえば、テキスト エディタを開いて文字を入力しても、システムはその文字をすぐにはディスクに書き込みません。代わりに、バッファに格納され、バッファがいっぱいになると、バッファの内容がディスクに書き込まれます。
もちろん、フラッシュを使用してバッファ データを強制的にディスクに書き込むこともできます。
echo、print などの php では、出力は tcp 経由で出力するためにブラウザーにすぐには渡されません。代わりに、データは php バッファーに書き込まれます。 PHP バッファがいっぱいになると、TCP 経由でブラウザに渡されます。
echo /print -> php 出力バッファ -> ブラウザ
php 出力バッファリング
デフォルトでは、php バッファーがオンになっており、デフォルト値は 4096 (4kb) です。 Output_buffering 設定は php.ini にあります。バッファがいっぱいになるまで、ブラウザには送信されません。
ob_start() を設定して、デフォルト値 (4kb) を超えてもすぐにブラウザに送信されないようにすることもできます。スクリプトが完了するか、ob_end_flush メソッドが呼び出されるまでブラウザーに出力されます。
1.output_buffering=4096、出力するデータが少なくなります (バッファー 1 つ未満)
<?php for($i=0; $i<10; $i++){ echo $i.'<br>'; sleep(2); } ?>
実行結果 : 待ちますデータが 1 つのバッファ サイズに満たないため、すべてのスクリプトが完了するまで出力されません。
2.output_buffering=4096、出力するデータを減らします (バッファー 1 つ未満)、output_buffering をオフにし、php.ini の output_buffering=0 を変更します
<?php for($i=0; $i<10; $i++){ echo $i.str_repeat(" ",500).'<br>'; // 当接受到的256(甚至更多)个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 flush(); sleep(1); } ?>
実行結果: PHP バッファリングが無効になっているため、出力する前にスクリプトの実行を待つ必要はなく、データは PHP バッファーに残りません。断続的な出力が確認できます。 echo -> tcpbuffer ->browser
3.output_buffering=4096 の場合、より大きなデータ (1 つのバッファより大きい) を出力します。ob_start( )
<?php for($i=0; $i<10; $i++){ echo file_get_contents('f.txt').$i.'<br>'; sleep(1); } ?>
実行結果: f.txt はバッファのデフォルト値より大きいため、バッファ容量が不足します。バッファがいっぱいになると出力されるため、断続的な出力が見られます。
4。output_buffering=4096 の場合、より大きなデータ (1 つのバッファより大きい) を出力するには、ob_start()
<?php ob_start(); for($i=0; $i<10; $i++){ echo file_get_contents('f.txt').$i.'<br>'; sleep(1); } ?>を使用します。
実行結果: ob_start()を使用しているためバッファに十分な容量が設定されているため、スクリプト実行まで保存され出力されます。
#output_buffering メソッド
##1.ob_startoutput_buffering メカニズムをアクティブにする、アクティブ化すると、スクリプトはブラウザに直接出力されなくなり、一時的に PHP バッファリング領域に書き込まれます。スクリプトの実行が完了するまで送信されません。
2.ob_get_contentsPHP バッファリングでデータを取得します。注: ob_end_clean() の前に呼び出す必要があります。そうしないと、空の文字しか取得されません。
3.ob_end_flush と ob_end_cleanob_end_flush は、PHP バッファリングにデータを出力しますが、クリアしません。 ob_end_clean は出力せず、php バッファリング内のデータをクリアするだけです。 注: この記事では、php 出力バッファリング キャッシュの使用方法について説明します。その他の関連コンテンツについては、php 中国語 Web サイトを参照してください。 関連する推奨事項: php を使用して BigPipe チャンク出力を実装する方法
マニュアルの ob_flush/flush の説明は出力バッファをリフレッシュするものであり、併用する必要があるため、多くの人に混乱を引き起こす可能性があります。 people...実際には、これらは別のオブジェクトに対して動作する場合もあります。#ob_* 一連の関数は、PHP 自体の出力バッファを動作させます。つまり、ob_flush は PHP 自体のバッファをリフレッシュすることです。And flash は、厳密に言えば、PHP が Apache モジュール (ハンドラーまたはフィルター) としてインストールされている場合にのみ実際に効果を持ちます。Web サーバーをリフレッシュします。 (特に apache を指すと考えられます)buffer.Apache モジュールの sapi の下で、flush は、sapi_module のフラッシュ メンバー関数ポインタを呼び出すことによって、間接的に Apache API を呼び出します。 ap_rflush は、Apache の出力バッファを更新します。もちろん、マニュアルには、このアクションの結果を変更する可能性のある Apache の他のモジュールもあるとも記載されています。mod_gzip などの一部の Apache モジュールは、それ自体で出力キャッシュを実行する可能性があり、生成された結果は、クライアントのブラウザーにすぐには送信されません。 ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは改行または HTML タグの先頭を受け取るまでコンテンツをキャッシュし、f16b1740fad44fb09bfe928bcc527e08 タグを受け取るまでテーブル全体を表示しません。 Microsoft Internet Explorer の一部のバージョンは、256 バイトを受信した後にのみページの表示を開始するため、これらのブラウザがページのコンテンツを表示できるようにするには、追加のスペースを送信する必要があります。
#つまり、この 2 つを使用する正しい順序は次のとおりです。最初に Ob_flush を実行し、次にフラッシュします。
もちろん、他の sapi ではフラッシュを呼び出すことはできませんが、コードの移植性を確保するために、フラッシュを併用することをお勧めします。
以上がphpのoutput_bufferingキャッシュの使い方を紹介します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。