ob_start() 和 ob_end_flush() 是一對很好的搭檔,可以實現對輸出的控制。當成一對出現理解起來就沒什麼問題,但是當他們兩個各自出現次數增加時,就比較難理解了.
view sourceprint?01 <?php
02 ob_start();
03 echo 'level 1<br/> ';
04 ob_start();
05 echo 'level 2<br/> ';
06 ob_start();
07 echo 'level 3<br/> ';
08 ob_end_flush();
09 ob_end_flush();
10 ob_end_flush();
很明顯,結果為:
level 1
level 2
level 3
當程序修改一下,修改一個ob_end_flush() 變成 ob_end_clean() 成為以下這個,你覺得結果會是怎樣呢?附上這幾個函數的講解:
ob_clean — 清空(擦掉)輸出緩沖區
ob_end_clean — 清空(擦除)緩沖區並關閉輸出緩沖
ob_end_flush — 沖刷出(送出)輸出緩沖區內容並關閉緩沖
ob_flush — 沖刷出(送出)輸出緩沖區中的內容
ob_start — 打開輸出控制緩沖
view sourceprint?01 <?php
02 ob_start();
03 echo 'level 1<br/> ';
04 ob_start();
05 echo 'level 2<br/> ';
06 ob_start();
07 echo 'level 3<br/> ';
08 ob_end_clean();//修改處
09 ob_end_flush();
10 ob_end_flush();
結果:
level 1
level 2
可能你會認為ob_end_clean()會清除與他最近的ob_start()的輸出;其實這個說法不是很全面,看下面的例子
view sourceprint?01 <?php
02 ob_start();
03 echo 'level 1<br/> ';
04 ob_start();
05 echo 'level 2<br/> ';
06 ob_start();
07 echo 'level 3<br/> ';
08 ob_end_clean(); //第一次修改
09 ob_end_flush();
10 ob_end_clean(); //第二次修改
這次,什麼都沒有輸出來。
中間不是有一個ob_flush()嗎?按理來說應該是輸出 level2 的。
其實造成這樣的主要原因是輸出的多級緩沖機制。這個程序例子有三個ob_start(),就意味著他有3個緩沖區A,B,C,而其實php程序本身也有一個最終輸出的緩沖區,我們就把他叫做F。
在這個程序中他這幾個緩沖區是有一定層次的,C->B->A->F,F層次最高,是程序最終的輸出緩沖,我們按上面的程序來進行講解。
剛開始。 F:null
view sourceprint?1 ob_start();
新建緩沖區A。 A: null -> F:null
view sourceprint?1 echo 'level 1<br/> ';
程序有輸出,輸出進入最低的緩沖區A A: 'level 1<br/>' -> F:null
view sourceprint?1 ob_start();
新建緩沖區B 。 B:null -> A: 'level 1<br/>' -> F:null
view sourceprint?1 echo 'level 2<br/> ';
程序有輸出,輸出進入最低的緩沖區B B:'level 2<br/> ' -> A: 'level 1<br/>' ->F:null
view sourceprint?1 ob_start();
新建緩沖區C C:null B:'level 2<br/> ' A: 'level 1<br/>' -> F:null
view sourceprint?1 echo 'level 3<br/> ';
程序有輸出,輸出進入最低的緩沖區C C:'level 3<br/> ' -> B:'level 2<br/> ' -> A: 'level 1<br/>' -> F:null
view sourceprint?1 ob_end_clean(); //第一次修改
緩沖區C被清空並關閉。 B:'level 2<br/> ' -> A: 'level 1<br/>' -> F:null
view sourceprint?1 ob_end_flush();
緩沖區B輸出到上一級的緩沖區A並關閉。 A: 'level 1<br/>level 2<br/> ' -> F:null
view sourceprint?1 ob_end_clean(); //第二次修改 www.2cto.com
緩沖區A被清空並關閉。 此時緩沖區A的東西還沒真正輸出到最終的F中,因此也就整個程序也就沒有任何的輸出了。
ob其他的函數還有很多,但只要能懂得這些機理應該也是不難懂的。附上其余函數
flush — 刷新輸出緩沖
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中使用的用來壓縮輸出緩沖區中內容的回調函數。ob_start callback function to gzip output buffer
ob_implicit_flush — 打開/關閉絕對刷送
ob_list_handlers — 列出所有使用中的輸出處理程序。
ob_start — 打開輸出控制緩沖
output_add_rewrite_var — 添加URL重寫器的值(Add URL rewriter values)
output_reset_rewrite_vars — 重設URL重寫器的值(Reset URL rewriter values)