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_end_clean — バッファをクリア (消去) し、出力バッファリングを閉じる
ob_end_flush — 出力バッファの内容をフラッシュして (送信して) バッファを閉じます
ob_flush — 出力バッファーの内容をフラッシュ (送信) します
ソースプリント?01
02 ob_start();
03 エコー 'レベル 1';
04 ob_start();
05 エコー 'レベル 2';
07 エコー 'レベル 3';
08 ob_end_clean();//修正
09 ob_end_flush();
10 ob_end_flush();
結果:
レベル1
レベル2ob_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
;
ソースプリントを表示?1 ob_start();
新しいバッファ C C:null B:'レベル 2
A:'レベル 1
->
プログラムには出力があり、その出力は C C:'レベル 3
B:'レベル 2
に入力されます。 ' -> フ:ヌル
view sourceprint?1 ob_end_clean() //最初の変更
バッファ C は空になり、閉じられます。 B: 'レベル 2
-> A: 'レベル 1
'
ソースプリントを表示?1 ob_end_flush();
バッファ B は前のレベルのバッファ A に出力され、閉じられます。 A: 'レベル 1;
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 リライター値をリセットします