PHPのoutput_bufferingの詳細な紹介

黄舟
リリース: 2023-03-17 18:36:01
オリジナル
2253 人が閲覧しました

タイトルを見たとき、output_buffering が何なのか分からず混乱している人も多いと思います。そこで、今日は PHP の Output_buffering について詳しく紹介します。知識をしっかりと固めることができるので、分からないことがあればしっかり勉強することができます。

1. php のキャッシュとは何かについて話しましょう。

PHPでは、キャッシュをクライアント側キャッシュ(ブラウザキャッシュ)とサーバー側キャッシュ(サーバーキャッシュ)に大別できます。 PHP は B/S アーキテクチャに基づいているため、ブラウザ側キャッシュとサーバー側キャッシュとして理解できます。
PHPに付属しているサーバー側のキャッシュは、大きく2種類のキャッシュに分けられます!プログラムキャッシュとOBキャッシュ!これは、サーバーサイド キャッシュの研究の主要な内容でもあります。

PHPにキャッシュされる出力シーケンスは次のとおりです:
開いたphp出力キャッシュ:

echo,print -> php output_buffering -> server buffering -> browser buffering -> browser display
ログイン後にコピー

開いていないphp出力キャッシュ:

echo,print -> server buffering -> browser buffering -> browser display
ログイン後にコピー

ブラウザ出力キャッシュ: IEは256バイト、ChromeとFireFoxは1000バイト、出力データのみがブラウザに出力されますページ上のデータは、この長さに達するかスクリプトが終了した後にのみ保存されます。

2. サーバー側の応答プロセス

A. クライアントがサーバーにリクエスト応答を送信します。
B. Apache サーバーは PHP モジュールをロードし、対応するプロセス (またはスレッド) を開始し、対応する PHP スクリプト ページを実行します。
C. OB キャッシュがオンになっていない場合、すべての実行結果はプログラム キャッシュに配置され、パッケージ化されてブラウザーに送信されます。ブラウザはページをレンダリングし、最後に見た WEB ページを生成します。
D. OB キャッシュがオンになっている場合、実行結果は OB キャッシュとプログラム キャッシュにそれぞれ入れられ、プログラムが最後の行に達すると、OB キャッシュ内のデータがプログラム キャッシュにフラッシュされます。をパッケージ化してブラウザに返します。ブラウザはページをレンダリングし、私たちが見ている WEB ページを生成します。

3. OB キャッシュの一般的な使用法!

a、output_buffering=4096、出力するデータが少なくなります (バッファー 1 つ未満)

for($i=0; $i<5; $i++){ 
 
echo $i.&#39;<br>&#39;; 
 
sleep(1); 
 
}
ログイン後にコピー

実行結果: データが 1 つのバッファーにいっぱいではないため、すべてのスクリプトが完了した後にのみ出力されます。

b、output_buffering=4096、出力するデータを少なくします(バッファーが 1 つ未満)、output_buffering をオフにし、php.ini の Output_buffering=0 を変更します

echo str_repeat(" ",1024);//这里重复输出一个空白
for($i=0; $i<5; $i++){ 
echo $i."<br/>";
  flush(); 
  sleep(1); 
}
ログイン後にコピー

実行結果: OB が無効になっているため、スクリプトが完了するまで待つ必要はありませんの実行が終了すると、データは OB に残らず、断続的な出力が表示されます。 echo ->ブラウザ バッファリング -> ブラウザ表示

c、output_buffering=4096、より大きなデータ (1 つのバッファより大きい) を出力、ob_start() を使用しない

for($i=0; $i<5; $i++){ 
  echo file_get_contents(&#39;f.txt&#39;).$i.&#39;<br/><br/><br/><br/>&#39;; 
  sleep(2); 
}
ログイン後にコピー

操作結果: f.txt は 4kb を超えるファイルです, バッファのデフォルト値よりも大きくバッファ容量が足りないため、バッファがいっぱいになるたびに出力することになり、断続的な出力が見られます。

d、output_buffering=4096、より大きなデータ(1つのバッファより大きい)を出力、ob_start()を使用します

ob_start(); 
for($i=0; $i<5; $i++){ 
  echo file_get_contents(&#39;f.txt&#39;).$i.&#39;<br/><br/><br/><br/>&#39;; 
  sleep(2); 
}
ログイン後にコピー

実行結果: ob_start()が使用されるため、バッファに十分なスペースが設定されるため、バッファは次のように保存されます。スクリプト実行完了後に出力されます。

e、output_buffering=On、ob_start()を使用します

ob_start();
echo "abc-";
header("content-type:text/html;charset=utf-8");
echo "hello-";
ob_end_flush();
echo "aa-";
echo ob_get_contents();
ログイン後にコピー
ログイン後にコピー

実行結果: abc-hello-aa-abc-hello-aa-

f、output_buffering=Off、ob_start()を使用します

ob_start();
echo "abc-";
header("content-type:text/html;charset=utf-8");
echo "hello-";
ob_end_flush();
echo "aa-";
echo ob_get_contents();
ログイン後にコピー
ログイン後にコピー

実行結果:

abc-hello-aa-
ログイン後にコピー

出力バッファはスタック可能です。つまり、1 つの ob_start() がアクティブなときに、別の ob_start() を呼び出すことができます。 ob_end_flush() を正しい回数だけ呼び出すようにしてください。 複数の出力 コールバック関数 がアクティブな場合、出力コンテンツは常にネストされた順序でフィルター処理されます。

注: PHP5.2 では、OB はデフォルトでオフになり、5.3 以降ではデフォルトでオンになります。

共通のメソッド:

1.ob_start
アクティブ化されると、スクリプトは次のようになります。ブラウザに直接出力されなくなりましたが、一時的に php バッファリング領域に書き込まれます。スクリプトの実行が完了するまで送信されません。

2.ob_get_contents
PHP バッファリングでデータを取得します。 注: ob_end_clean() の前に呼び出す必要があります。そうしないと、空の文字のみが取得されます。

3.ob_end_flush と ob_end_clean
ob_end_flush は、PHP バッファリング内のデータを出力しますが、クリアしません。
ob_end_clean は出力せず、php バッファリング内のデータをクリアするだけです。

4.ob_flush、flush、ob_implicit_flush
ob_flush は、php バッファリング内のデータをプログラム キャッシュに更新します

flush は、プログラム キャッシュをブラウザ キャッシュに更新します

ob_implicit_flush は、絶対 (暗黙的) をオンまたはオフにしますブラシで送ります。絶対的 (暗黙的) フラッシュでは、各出力呼び出しの後にフラッシュ操作が行われるため、flush() への明示的な呼び出しは不要になります

4. OB キャッシュの役割!

OB キャッシュはさまざまな側面で使用されますが、私が知っているのは主に 2 つの側面です。
a. Web サイトを静的にする場合は、OB キャッシュを選択するのが良い選択です。

b. エラーを解決します。 警告: ヘッダー情報は変更できません - ヘッダーはすでに送信されています。
エラーの理由: 応答ヘッダーと対応する本文の不整合が原因です。通常の状況では、サーバーからブラウザに返される対応するコンテンツは、応答ヘッダー + 応答本文となるはずです。

ただし、OB キャッシュをオンにすると、対応するヘッダー情報 (通常は header() 関数によって設定された情報) がプログラム キャッシュに配置されます。
他の出力コンテンツ (echo print_r var_dump など) は、最初に OB キャッシュに入れられます。
プログラムが終了するか、OB キャッシュが閉じたら、OB キャッシュの内容をプログラム キャッシュに入れます。これにより、応答ヘッダー情報が常に応答本文の内容よりも前に配置されるようになります。

概要:

この記事を学習することで、output_buffering を知らない友人がそれを理解できるようになり、知識を定着させることができると幸いです。あなたの仕事!

関連する推奨事項:

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

PHP出力に基づいたoutput_bufferingキャッシュの使用方法の紹介

- キャッシングについての深い理解(output_buffering)

以上がPHPのoutput_bufferingの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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