php ob_start()、ob_end_flush和ob_end_clean()多級緩沖

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)

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *