Php output buffering緩存及程序緩存深入解析
在測(cè)試前為了測(cè)試效果更明顯,我們?cè)趐hp.ini里先關(guān)閉ob緩存并設(shè)置明顯的錯(cuò)誤級(jí)別。
Output_buffering=off
Display_errors=on
代碼1:
echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';
則會(huì)出現(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'時(shí)已經(jīng)向?yàn)g覽器發(fā)送一個(gè)頭信息,
當(dāng)再出現(xiàn)
header("content-type:text/html;charset='utf-8'");
又看到一個(gè)頭信息,這時(shí)已經(jīng)打回了上面的頭信息,無(wú)法更該便出錯(cuò)了。
代碼2:開啟了ob緩存,echo ‘php'時(shí)把要打給瀏覽器的數(shù)據(jù)先放到ob緩存里,之后又遇到一個(gè)頭信息,也放入Ob緩存,頁(yè)面結(jié)束時(shí)再按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;
會(huì)輸出
Ob_get_contents()只是取得ob緩存里的內(nèi)容而不清楚它們
Ob_get_contents()必須在ob緩存沒(méi)有清除前使用
代碼4:
ob_start();
echo "php";
ob_clean();//清除緩存內(nèi)容但不關(guān)閉緩存區(qū),還能用(往里添加?xùn)|西)
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)容并關(guān)閉緩存區(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)并關(guān)閉ob緩存
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;
代碼7:對(duì)比代碼6 與ob_flush()比較
ob_start();
echo "php";
ob_flush();//把Ob 緩存送到程序緩存,不關(guān)閉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)容但不關(guān)閉
Ob_get_flush()
沖刷出緩存到程序緩存,關(guān)閉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緩存沖刷到程序緩存再?zèng)_刷到瀏覽器輸出,不影響ob緩存
echo ob_get_contents();
//aa
代碼10:
ob_start();
echo 'a';
ob_flush();//把Ob緩存沖刷到程序緩存,ob里沒(méi)有了緩存內(nèi)容
echo "<br/>ob_con".ob_get_contents();
//a 是按正常輸出的,Ob里沒(méi)內(nèi)容
程序緩存:
代碼11:
echo str_repeat(" ",1024);//一些版本的 Microsoft Internet Explorer 只有當(dāng)接受到的256個(gè)字節(jié)以后才開始顯示該頁(yè)面,所以必須發(fā)送一些額外的空格來(lái)讓這些瀏覽器顯示頁(yè)面內(nèi)容。
for($i=0;$i<5;$i++){
echo $i;
echo "<br/>";
sleep(1);
flush();
}
會(huì)一秒輸出一個(gè)數(shù)字
如果沒(méi)有flush();會(huì)把所有的輸出先暫存在程序緩存里,等完畢在整體返回給瀏覽器 這個(gè)例子說(shuō)明了程序緩存
相關(guān)文章
CentOS7系統(tǒng)搭建LAMP及更新PHP版本操作詳解
這篇文章主要介紹了CentOS7系統(tǒng)搭建LAMP及更新PHP版本操作,總結(jié)分析了CentOS7系統(tǒng)搭建LAMP及更新PHP版本操作相關(guān)原理、步驟、操作命令與注意事項(xiàng),需要的朋友可以參考下2020-03-03php基礎(chǔ)知識(shí):類與對(duì)象(4) 范圍解析操作符(::)
php基礎(chǔ)知識(shí):類與對(duì)象(4) 范圍解析操作符(::)...2006-12-12PHP中echo,print_r與var_dump區(qū)別分析
這篇文章主要介紹了PHP中echo,print_r與var_dump區(qū)別分析,主要講述了三者的類型本質(zhì)及其操作數(shù)據(jù)類型的用法區(qū)別,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09php存儲(chǔ)過(guò)程調(diào)用實(shí)例代碼
php存儲(chǔ)過(guò)程調(diào)用舉例,供大家學(xué)習(xí)參考2013-02-02對(duì)php 判斷http還是https,以及獲得當(dāng)前url的方法詳解
今天小編就為大家分享一篇對(duì)php 判斷http還是https,以及獲得當(dāng)前url的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01PHP基于redis計(jì)數(shù)器類定義與用法示例
這篇文章主要介紹了PHP基于redis計(jì)數(shù)器類定義與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了php定義的redis計(jì)數(shù)器類及其相關(guān)使用技巧,需要的朋友可以參考下2018-02-02PHP與Perl之間知識(shí)點(diǎn)區(qū)別整理
在本篇文章里小編給大家分享了關(guān)于PHP與Perl的卻別以及相關(guān)知識(shí)點(diǎn)整理,有興趣的朋友們學(xué)習(xí)下。2019-03-03Content-Disposition使用方法和注意事項(xiàng)
這篇文章主要為大家詳細(xì)介紹了Content-Disposition使用方法和注意事項(xiàng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09利用php遞歸實(shí)現(xiàn)無(wú)限分類 格式化數(shù)組的詳解
本篇文章是對(duì)使用php遞歸實(shí)現(xiàn)無(wú)限分類 格式化數(shù)組進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06