php ob_start()、ob_end_flush、ob_end_clean() マルチレベルバッファリング_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:52:55
オリジナル
764 人が閲覧しました

ob_start() と ob_end_flush() は出力を制御するのに適したペアです。ペアで出現する場合は理解に問題ありませんが、出現回数が増えるとさらにわかりにくくなります


ソースプリント?01

02 ob_start();

03 エコー 'レベル 1';

04 ob_start();

05 エコー 'レベル 2';

06 ob_start();

07 エコー 'レベル 3';

08 ob_end_flush();

09 ob_end_flush();

10 ob_end_flush();

明らかに、結果は次のようになります:

レベル1

レベル2

レベル3

プログラムを修正して、ob_end_flush() を ob_end_clean() に変更して次のようにした場合、結果はどうなると思いますか?これらの機能の説明を添付します:


ob_clean — 出力バッファをクリア (消去) します

ob_end_clean — バッファをクリア (消去) し、出力バッファリングを閉じる
ob_end_flush — 出力バッファの内容をフラッシュして (送信して) バッファを閉じます
ob_flush — 出力バッファーの内容をフラッシュ (送信) します

ob_start — 出力制御バッファーを開きます

ソースプリント?01
02 ob_start();
03 エコー 'レベル 1';
04 ob_start();
05 エコー 'レベル 2';

06 ob_start();

07 エコー 'レベル 3';
08 ob_end_clean();//修正

09 ob_end_flush();

10 ob_end_flush();

結果:

レベル1

レベル2

ob_end_clean() が最新の ob_start() の出力をクリアすると思っているかもしれませんが、実際には、このステートメントはあまり包括的ではありません。以下の例を参照してください。

ソースプリント?01

02 ob_start();

03 エコー 'レベル 1';

04 ob_start();

05 エコー 'レベル 2';

06 ob_start();

07 エコー 'レベル 3';
08 ob_end_clean(); //最初の変更

09 ob_end_flush();
10 ob_end_clean() //2 番目の変更

今回は何も出力されません。


途中にob_flush()はありませんか?論理的に言えば、level2 が出力されるはずです。

実際、これの主な理由は、出力のマルチレベル バッファリング メカニズムです。このプログラム例には 3 つの ob_start() があります。これは、3 つのバッファ A、B、C があることを意味します。実際、php プログラム自体にも最終出力バッファがあり、それを F と呼びます。

このプログラムでは、これらのバッファーには C->B->A->F というレベルがあり、F が最上位であり、プログラムの最終出力バッファーとなります。 。

はじまったばかり。 F:ヌル

ソースプリントを表示?1 ob_start();

新しいバッファ A を作成します。 A: null -> F: null

view sourceprint?1 echo 'レベル 1

プログラムには出力があり、その出力は最下位のバッファに入ります A: 'レベル 1
->'
sourceprint?1 ob_start() を表示します

新しいバッファBを作成します。 B:null -> A: 'レベル 1
' F:null

view sourceprint?1 echo 'レベル 2

プログラムには出力があり、その出力は最下位のバッファ B B:'レベル 2
-> A:'レベル 1
F:null

;

ソースプリントを表示?1 ob_start();

新しいバッファ C C:null B:'レベル 2
A:'レベル 1
->

view sourceprint?1 echo 'レベル 3


プログラムには出力があり、その出力は C C:'レベル 3
B:'レベル 2
に入力されます。 ' -> フ:ヌル


view sourceprint?1 ob_end_clean() //最初の変更

;


バッファ C は空になり、閉じられます。 B: 'レベル 2
-> A: 'レベル 1
'

ソースプリントを表示?1 ob_end_flush();

バッファ B は前のレベルのバッファ A に出力され、閉じられます。 A: 'レベル 1
レベル 2
F:null

;
sourceprint?1 ob_end_clean() を表示 //2 番目の変更 www.2cto.com

バッファ A がクリアされて閉じられます。 この時点では、実際にはバッファ A の内容が最後の F に出力されていないため、プログラム全体としては何も出力されません。

ob他にもたくさんの機能がありますが、これらの仕組みさえ理解できれば、理解するのは難しくないはずです。残りの機能を添付します


flash — 出力バッファをフラッシュします
ob_clean — 出力バッファをクリア (消去) します
ob_end_clean — バッファをクリア (消去) し、出力バッファリングを閉じる
ob_end_flush — 出力バッファの内容をフラッシュして (送信して) バッファを閉じます
ob_flush — 出力バッファーの内容をフラッシュ (送信) します
ob_get_clean — 現在のバッファの内容を取得し、現在の出力バッファを削除します。
ob_get_contents — 出力バッファーの内容を返します
ob_get_flush — バッファの内容をフラッシュ (送信) し、内容を文字列として返し、出力バッファを閉じます。
ob_get_length — 出力バッファーの内容の長さを返します
ob_get_level — 出力バッファリングメカニズムのネストレベルを返します
ob_get_status — すべての出力バッファーのステータスを取得します
ob_gzhandler — 出力バッファの内容を圧縮するために ob_start で使用されるコールバック関数。 gzip 出力バッファへの ob_start コールバック関数
ob_implicit_flush — 絶対フラッシュをオン/オフにする
ob_list_handlers — 使用中のすべての出力ハンドラーをリストします。
ob_start — 出力制御バッファーを開きます
Output_add_rewrite_var — URL リライター値を追加します
Output_reset_rewrite_vars — URL リライター値をリセットします


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478080.html技術記事 ob_start() と ob_end_flush() は、出力を制御するのに適したペアです。ペアで登場する分には問題ないのですが、二人で登場することが多くなると…
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート