Php output buffering緩存及程序緩存深入解析
更新時間:2013年07月15日 09:28:36 作者:
在php中有時為了控制程序的輸出顯示順序,提供了output buffering緩存(php自身緩存機制)。若Ob緩存開啟,需要輸出的就先存在ob緩存里,再到程序緩存里。若沒有開啟,則直接進入程序緩存,程序執(zhí)行完畢,按照順序從程序緩存里輸出
下面測試ob緩存和程序緩存:
在測試前為了測試效果更明顯,我們在php.ini里先關閉ob緩存并設置明顯的錯誤級別。
Output_buffering=off
Display_errors=on
代碼1:
echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';
則會出現(xiàn)
php
Warning: Cannot modify header information - headers already sent by (output started at D:\www\apache\htdocs\test\t2.php:2) in D:\www\apache\htdocs\test\t2.php on line 3
ok
代碼2:
ob_start();
echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';
結(jié)果就完全正確了
原因分析:
代碼1:Php在echo ‘php'時已經(jīng)向瀏覽器發(fā)送一個頭信息,
當再出現(xiàn)
header("content-type:text/html;charset='utf-8'");
又看到一個頭信息,這時已經(jīng)打回了上面的頭信息,無法更該便出錯了。
代碼2:開啟了ob緩存,echo ‘php'時把要打給瀏覽器的數(shù)據(jù)先放到ob緩存里,之后又遇到一個頭信息,也放入Ob緩存,頁面結(jié)束時再按http協(xié)議到程序緩存后返回給瀏覽器。
為加深理解再看以下代碼
代碼3:
ob_start();
echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;
會輸出
ob_start();
echo "php";
ob_clean();//清除緩存內(nèi)容但不關閉緩存區(qū),還能用(往里添加東西)
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;
結(jié)果:
ob_start();
echo "php";
ob_end_clean();//清空緩存內(nèi)容并關閉緩存區(qū),ob_get_contents取不到內(nèi)容
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;
結(jié)果:
ob_start();
echo "php";
ob_end_flush();//把緩存送到程序緩存內(nèi)并關閉ob緩存
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;
代碼7:對比代碼6 與ob_flush()比較
ob_start();
echo "php";
ob_flush();//把Ob 緩存送到程序緩存,不關閉ob緩存
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;
結(jié)果:
Ob_start();
echo 'abc';
header("content-type:text/html;charset='utf-8'");
echo 'hello';
Ob_flush();
echo 'aa';
echo ob_get_contents();
//abchelloaaaa
2.ob_flush(),flush()與程序緩存
代碼9:
ob_start();
echo 'a';
flush();//把Ob緩存沖刷到程序緩存再沖刷到瀏覽器輸出,不影響ob緩存
echo ob_get_contents();
//aa
代碼10:
ob_start();
echo 'a';
ob_flush();//把Ob緩存沖刷到程序緩存,ob里沒有了緩存內(nèi)容
echo "<br/>ob_con".ob_get_contents();
//a 是按正常輸出的,Ob里沒內(nèi)容
程序緩存:
代碼11:
echo str_repeat(" ",1024);//一些版本的 Microsoft Internet Explorer 只有當接受到的256個字節(jié)以后才開始顯示該頁面,所以必須發(fā)送一些額外的空格來讓這些瀏覽器顯示頁面內(nèi)容。
for($i=0;$i<5;$i++){
echo $i;
echo "<br/>";
sleep(1);
flush();
}
會一秒輸出一個數(shù)字
如果沒有flush();會把所有的輸出先暫存在程序緩存里,等完畢在整體返回給瀏覽器 這個例子說明了程序緩存
在測試前為了測試效果更明顯,我們在php.ini里先關閉ob緩存并設置明顯的錯誤級別。
Output_buffering=off
Display_errors=on
代碼1:
復制代碼 代碼如下:
echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';
則會出現(xiàn)
php
Warning: Cannot modify header information - headers already sent by (output started at D:\www\apache\htdocs\test\t2.php:2) in D:\www\apache\htdocs\test\t2.php on line 3
ok
代碼2:
復制代碼 代碼如下:
ob_start();
echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';
結(jié)果就完全正確了
原因分析:
代碼1:Php在echo ‘php'時已經(jīng)向瀏覽器發(fā)送一個頭信息,
當再出現(xiàn)
header("content-type:text/html;charset='utf-8'");
又看到一個頭信息,這時已經(jīng)打回了上面的頭信息,無法更該便出錯了。
代碼2:開啟了ob緩存,echo ‘php'時把要打給瀏覽器的數(shù)據(jù)先放到ob緩存里,之后又遇到一個頭信息,也放入Ob緩存,頁面結(jié)束時再按http協(xié)議到程序緩存后返回給瀏覽器。
為加深理解再看以下代碼
代碼3:
復制代碼 代碼如下:
ob_start();
echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;
會輸出

Ob_get_contents()只是取得ob緩存里的內(nèi)容而不清楚它們
Ob_get_contents()必須在ob緩存沒有清除前使用
代碼4:
復制代碼 代碼如下:
ob_start();
echo "php";
ob_clean();//清除緩存內(nèi)容但不關閉緩存區(qū),還能用(往里添加東西)
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;
結(jié)果:

代碼5:
復制代碼 代碼如下:
ob_start();
echo "php";
ob_end_clean();//清空緩存內(nèi)容并關閉緩存區(qū),ob_get_contents取不到內(nèi)容
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;
結(jié)果:

代碼6:
復制代碼 代碼如下:
ob_start();
echo "php";
ob_end_flush();//把緩存送到程序緩存內(nèi)并關閉ob緩存
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;
代碼7:對比代碼6 與ob_flush()比較
復制代碼 代碼如下:
ob_start();
echo "php";
ob_flush();//把Ob 緩存送到程序緩存,不關閉ob緩存
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;
結(jié)果:

Ob_clean()
清空ob緩存內(nèi)容但不關閉
Ob_get_flush()
沖刷出緩存到程序緩存,關閉ob緩存
代碼8:
復制代碼 代碼如下:
Ob_start();
echo 'abc';
header("content-type:text/html;charset='utf-8'");
echo 'hello';
Ob_flush();
echo 'aa';
echo ob_get_contents();
//abchelloaaaa
2.ob_flush(),flush()與程序緩存
代碼9:
復制代碼 代碼如下:
ob_start();
echo 'a';
flush();//把Ob緩存沖刷到程序緩存再沖刷到瀏覽器輸出,不影響ob緩存
echo ob_get_contents();
//aa
代碼10:
復制代碼 代碼如下:
ob_start();
echo 'a';
ob_flush();//把Ob緩存沖刷到程序緩存,ob里沒有了緩存內(nèi)容
echo "<br/>ob_con".ob_get_contents();
//a 是按正常輸出的,Ob里沒內(nèi)容
程序緩存:
代碼11:
復制代碼 代碼如下:
echo str_repeat(" ",1024);//一些版本的 Microsoft Internet Explorer 只有當接受到的256個字節(jié)以后才開始顯示該頁面,所以必須發(fā)送一些額外的空格來讓這些瀏覽器顯示頁面內(nèi)容。
for($i=0;$i<5;$i++){
echo $i;
echo "<br/>";
sleep(1);
flush();
}
會一秒輸出一個數(shù)字
如果沒有flush();會把所有的輸出先暫存在程序緩存里,等完畢在整體返回給瀏覽器 這個例子說明了程序緩存
相關文章
PHP開發(fā)環(huán)境配置(MySQL數(shù)據(jù)庫安裝圖文教程)
下載完軟件后開始PHP開發(fā)環(huán)境的配置。注意是開發(fā)環(huán)境,不是服務器環(huán)境。2010-04-04
瀏覽器預覽PHP文件時頂部出現(xiàn)空白影響布局分析原因及解決辦法
在編寫PHP文件過程中,發(fā)現(xiàn)在瀏覽器預覽PHP文件時,頂部會出現(xiàn)一行空白,影響了頁面的布局2013-01-01
php將mysql數(shù)據(jù)庫整庫導出生成sql文件的具體實現(xiàn)
下面是php將mysql數(shù)據(jù)庫整庫導出生成sql文件的詳細代碼,希望對大家在用php編程時備份數(shù)據(jù)有一定幫助2014-01-01

