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

ob_start() 和 ob_end_flush() 是一對很好的搭檔,能夠實現對輸出的控制。當成一對出現理解起來就沒什麼問題,可是當他們兩個各自出現次數增長時,就比較難理解了.php

<?php
ob_start(); 
echo 'level 1<br/> ';
ob_start(); 
echo   'level 2<br/> ';
ob_start(); 
echo  'level 3<br/> ';
ob_end_flush();
ob_end_flush();
ob_end_flush();

很明顯,結果爲:

level 1
level 2
level 3函數

當程序修改一下,修改一個ob_end_flush() 變成 ob_end_clean() 成爲如下這個,你以爲結果會是怎樣呢?附上這幾個函數的講解:spa

  • ob_clean — 清空(擦掉)輸出緩衝區
  • ob_end_clean — 清空(擦除)緩衝區並關閉輸出緩衝
  • ob_end_flush — 沖刷出(送出)輸出緩衝區內容並關閉緩衝
  • ob_flush — 沖刷出(送出)輸出緩衝區中的內容
  • ob_start — 打開輸出控制緩衝

<?php
ob_start(); 
echo   'level 1<br/> ';
ob_start(); 
echo   'level 2<br/> ';
ob_start(); 
echo   'level 3<br/> ';
ob_end_clean();//修改處
ob_end_flush();
ob_end_flush();

結果:

level 1
level 2.net

可能你會認爲ob_end_clean()會清除與他最近的ob_start()的輸出;其實這個說法不是很全面,看下面的例子code

<?php
ob_start(); 
echo   'level 1<br/> ';
ob_start(); 
echo   'level 2<br/> ';
ob_start(); 
echo   'level 3<br/> ';
ob_end_clean(); //第一次修改
ob_end_flush();
ob_end_clean(); //第二次修改

此次,什麼都沒有輸出來。

中間不是有一個ob_flush()嗎?按理來講應該是輸出  level2 的。orm

其實形成這樣的主要緣由是輸出的多級緩衝機制。這個程序例子有三個ob_start(),就意味着他有3個緩衝區A,B,C,而其實php程序自己也有一個最終輸出的緩衝區,咱們就把他叫作F。ip

在這個程序中他這幾個緩衝區是有必定層次的,C->B->A->F,F層次最高,是程序最終的輸出緩衝,咱們按上面的程序來進行講解。ci


剛開始。  F:null 字符串

ob_start();

 新建緩衝區A。  A: null -> F:nullget

echo   'level 1<br/> ';

程序有輸出,輸出進入最低的緩衝區A  A: 'level 1<br/>' -> F:null

 ob_start(); 

新建緩衝區B 。 B:null  ->  A: 'level 1<br/>' -> F:null

echo   'level 2<br/> ';

程序有輸出,輸出進入最低的緩衝區B     B:'level 2<br/> ' ->  A: 'level 1<br/>' ->F:null

ob_start();

新建緩衝區C   C:null  B:'level 2<br/> '   A: 'level 1<br/>' -> F:null

echo   'level 3<br/> ';

程序有輸出,輸出進入最低的緩衝區C    C:'level 3<br/> '  ->  B:'level 2<br/> '  ->  A: 'level 1<br/>' -> F:null

ob_end_clean(); //第一次修改

緩衝區C被清空並關閉。  B:'level 2<br/> '  ->  A: 'level 1<br/>' -> F:null

ob_end_flush();

緩衝區B輸出到上一級的緩衝區A並關閉。   A: 'level 1<br/>level 2<br/> ' -> F:null

ob_end_clean(); //第二次修改

 緩衝區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)
相關文章
相關標籤/搜索