ホームページ  >  記事  >  バックエンド開発  >  PHPに基づく出力バッファの基本概念と原理の分析

PHPに基づく出力バッファの基本概念と原理の分析

步履不停
步履不停オリジナル
2019-06-24 17:26:074227ブラウズ

PHPに基づく出力バッファの基本概念と原理の分析

1. 概念

PHP の実行中に、出力を生成する関数または演算結果を PHP バッファーに一時的に保存できます。バッファがいっぱいになったとき、PHPの実行が終了したとき、または必要なときに出力が行われたときのみ、ブラウザにデータが出力される領域で、バッファリングされたデータのこの領域をPHPの出力バッファ(OB)と呼びます。

2. 原則

①バッファを使用した後、PHP を実行するときに、echo や print_r などのデータを出力するコードに遭遇した場合 (実際には多くの関数が出力を生成します) ), PHP は出力されるデータを PHP 自身のバッファに入れて出力を待ちます;

②PHP 自身のバッファがバッファの内容を出力する必要があることを示す命令を受け取ると、バッファ内のデータがサーバーはPHPが出力したデータを受け取り、サーバー自身のバッファにデータを格納して出力を待ちます;

③サーバーが受け付けたとき 命令に到達したとき、ちょうどあなたがバッファの内容を出力したい場合は、バッファの内容が出力されてブラウザに返されます。

PHPに基づく出力バッファの基本概念と原理の分析上記のとおり、出力バッファ層は出力のバッファリングに使用される唯一の層ではなく、実際には多くの層のうちの 1 つにすぎません。最後に覚えておく必要があるのは、出力バッファ層の動作は、使用している SAPI (Web または CLI) に関連しているということです。SA​​PI が異なれば動作も異なる場合があります。

最初の概念で述べたように、バッファーがいっぱいになるとバッファリングされたデータが出力されます。これは SAPI に関連しており、バッファーは主に php.ini の Output_buffering 変数を通じて制御されます。 Output_buffering のデフォルトは on で、デフォルト値は 4096 (4kb) です。

3. 出力バッファの構成

1. 普段使用している PHP-FPM の SAPI を例に、PHP ini ファイルの構成をまとめます。 : 主に 3 つのオプションがあります:

output_buffering
implicit_flush
output_handler

# #これら 3 つのパラメータの意味を明確にするために表を使用します:

PHPに基づく出力バッファの基本概念と原理の分析

#上記の 3 つの値は、実行時に ini_set() を使用して変更できないことに注意してください。

2. PHP CLI モードで実行する場合の設定に関しては、FPM とは異なり、注意すべき点がいくつかあります:

(1) デフォルトでは、output_buffering パラメータは有効になっていません。

(2) implicit_flush パラメータはデフォルトで 1 (オン) に設定されます。

3.output_handler 設定コールバック関数に関しては、いくつかの一般的な設定を参照できます:

①ob_gzhandler: 出力を圧縮するために ext/zlib を使用します;

②mb_output_handler: ext を使用します/mbstring 変換 文字エンコーディング;

③ob_iconv_handler: 文字エンコーディングを変換するには ext/iconv を使用します;

④ob_tidyhandler: 出力 HTML テキストを整理するには ext/tidy を使用します;

⑤ob_[ inflate/deflate]_handler : ext/http を使用して出力を圧縮します;

⑥ob_etaghandler: ext/http を使用して HTTP Etag を自動的に生成します;

4. 出力バッファー関連のメソッド

ob_start(); //出力バッファを開きます。すべての出力情報は次の層に直接送信されなくなり、出力バッファに保存されます。

ob_clean(); //バッファを閉じずに内部バッファの内容を削除します (出力なし)。
ob_end_clean(); //内部バッファの内容を削除し、バッファを閉じます(出力なし)。
ob_get_clean(); //内部バッファの内容を返し、バッファを閉じます。
ob_flush(); //バッファの内容を次の層に送信し、バッファの内容を削除し、バッファを閉じません。
ob_end_flush(); //バッファの内容を次のレイヤに送信し、バッファの内容を削除して、バッファを閉じます。
ob_get_flush(); //バッファの内容を返し、バッファを閉じて、バッファの内容を解放します。
ob_get_contents(); //出力せずにバッファの内容を返します。
ob_get_length(); //バッファの長さを返します。バッファがアクティブ化されていない場合は、FALSE を返します。
ob_get_status() ; //すべての出力バッファのステータスを取得します。
ob_implicit_flush(); //絶対フラッシュをオン/オフします。

5. 出力バッファのアプリケーション

1. セッション前に開く、Cookie、ヘッダー、その他の設定関数:

最も一般的なものは Before です。 header 関数を使用すると、一部のデータが出力され、次のような特定のエラーが発生します。ヘッダー情報は変更できません – ヘッダーは既に送信されました;

このエラーの理由は、ヘッダーよりも先に出力されているためです。特定のデータ、このデータの出力中に、サーバーはブラウザーに応答ステータスも送信します (出力があるため、リクエストは有効です)。その後、ヘッダー関数を再度使用します

http を送信しますこのエラーは、HTTP ヘッダーが送信されたため、変更できないことを意味します。

したがって、最初に ob_start メソッドを有効にすることができます。

2. PHP プログラムのダウンロード機能を制御する:

通常、ファイルのダウンロードには PHP を使用する人が多いと思いますが、ファイルのサイズが大きすぎる場合 (たとえば 100M)、ファイルを読み込むと、最初にメモリに転送されてからユーザーに転送されると、応答時間が大幅に長くなり (またはタイムアウトになり)、メモリ使用量も大幅に増加します (またはオーバーフローすることもあります)。

出力バッファリングを使用すると、読み取ったファイルをバッファに読み取り、特定のサイズに達したときにユーザーに転送し、読み取りを継続してシャーディングの効果を実現できます。このようにして、ブラウザはすべてのファイルが読み取られるまで待たずにデータの受信を続けることができ、メモリをあまり消費しません。

3. 静的ファイルとしてキャッシュ:

複数回読み取る必要があり、変更の頻度が非常に低いファイルは、最初の読み取り時にバッファーに置かれ、静的ファイルが生成されます。ファイル。以降の各読み取りは、PHP 処理 (データベースの読み取りなど) を経由せずに直接返すことができます。

PHP 関連の技術記事の詳細については、PHP チュートリアル 列にアクセスして学習してください。

以上がPHPに基づく出力バッファの基本概念と原理の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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