程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php ob_start()、ob_end_flush和ob_end_clean()多級緩沖

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

編輯:關於PHP編程

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)

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved