- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- PHP中怎么實(shí)現輸出緩沖控制
PHP中怎么實(shí)現輸出緩沖控制,針對這個(gè)問(wèn)題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
PHP輸出緩沖控制是什么
默認情況下,phpbuffer是開(kāi)啟的,而且該buffer默認值是4096,即4kb。你可以通過(guò)在php.ini配置文件中找到output_buffering配置。buffer是一個(gè)內存地址空間,Linux系統默認大小一般為4096(4kb),即一個(gè)內存頁(yè)。主要用于存儲速度不同步的設備或者優(yōu)先級不同的設備之間傳辦理數據的區域。通過(guò)buffer,可以使進(jìn)程這間的相互等待變少。這里說(shuō)一個(gè)通俗一點(diǎn)的例子,你打開(kāi)文本編輯器編輯一個(gè)文件的時(shí)候,你每輸入一個(gè)字符,操作系統并不會(huì )立即把這個(gè)字符直接寫(xiě)入到磁盤(pán),而是先寫(xiě)入到buffer,當寫(xiě)滿(mǎn)了一個(gè)buffer的時(shí)候,才會(huì )把buffer中的數據寫(xiě)入磁盤(pán),當然當調用內核函數flush()的時(shí)候,強制要求把buffer中的臟數據寫(xiě)回磁盤(pán)。
PHP輸出緩沖控制代碼怎么寫(xiě)
echo"南無(wú)阿彌陀佛
";
header("content-type:text/html;charset='utf-8'");
echo"真善忍好!";
//output
//南無(wú)阿彌陀佛
//真善忍好
header()必須在任何實(shí)際輸出之前調用,但是我們程序已經(jīng)輸出了,卻正常運行。在看下面的代碼:
echo"南無(wú)阿彌陀佛
";
ob_flush();
header("content-type:text/html;charset='utf-8'");
echo"真善忍好!";
//output
//南無(wú)阿彌陀佛
//Cannotmodifyheaderinformation-headersalreadysentby(outputstartedatE:\php\test.php:3)
//真善忍好
上面程序說(shuō)明程序并沒(méi)有立即輸出,而當調用ob_flush函數的時(shí)候才刷新緩沖,輸出。
ob_flush()與flush()
ob_flush(),flush()函數php手冊上都有詳細的說(shuō)明,你可以去查閱一下。二者的區別是:
ob_flush()是刷新PHP自身的緩沖區
flush()是它是刷新WebServer的緩沖。輸出到瀏覽器。但是會(huì )出現下面的情況:
個(gè)別web服務(wù)器程序,特別是Win32下的web服務(wù)器程序,在發(fā)送結果到瀏覽器之前,仍然會(huì )緩存腳本的輸出,直到程序結束為止。有些Apache的模塊,比如mod_gzip,可能自己進(jìn)行輸出緩存,這將導致flush()函數產(chǎn)生的結果不會(huì )立即被發(fā)送到客戶(hù)端瀏覽器。甚至瀏覽器也會(huì )在顯示之前,緩存接收到的內容。例如Netscape瀏覽器會(huì )在接受到換行或html標記的開(kāi)頭之前緩存內容,并且在接受到標記之前,不會(huì )顯示出整個(gè)表格。一些版本的MicrosoftInternetExplorer只有當接受到的256個(gè)字節以后才開(kāi)始顯示該頁(yè)面,所以必須發(fā)送一些額外的空格來(lái)讓這些瀏覽器顯示頁(yè)面內容。
比如:
/**
Server:LightTPD/1.4.28(Win32)
X-Powered-By:PHP/5.3.27
*/
echo'佛法無(wú)邊'."
";
ob_flush();
flush();
sleep(1);
echo'法輪常轉';
//output
上面的代碼在chrome瀏覽器上面是一行一行的輸出,在ie系列的瀏覽器則是全部輸出。其實(shí)就是上面的第四條一些瀏覽器只有當接收256個(gè)字符才開(kāi)始顯示。把上面的代碼改成下面形式:
/**
Server:LightTPD/1.4.28(Win32)
X-Powered-By:PHP/5.3.27
*/
echostr_pad('',240)."\n";
echo'佛法無(wú)邊'."
";
ob_flush();
flush();
sleep(1);
echo'法輪常轉';
//output
這樣在ie下面就會(huì )一行一行輸出,因為超過(guò)256個(gè)字符。
ob其他函數說(shuō)明
1.ob_end_flush與ob_end_clean
end的顧名思義就結束,關(guān)閉緩沖區,都是關(guān)閉輸出緩沖,一個(gè)是輸出緩沖區,一個(gè)是清除。比如
/**
Server:LightTPD/1.4.28(Win32)
X-Powered-By:PHP/5.3.27
*/
echo'before';
ob_end_clean();
echostr_pad('',4096)."\n";
for($i=10;$i>0;$i--)
{
echo$i;
sleep(1);
}
上述代碼是一下輸出全部?jì)热?,而不是一個(gè)一個(gè)輸出。ob_end_clean()不是關(guān)閉了緩沖了?怎么不是一個(gè)一個(gè)輸出呢,其實(shí)我們上面也說(shuō)了,php不是直接輸出給瀏覽器,而是webserver。雖然php沒(méi)有了緩沖。但是webserver還是有的。所以下面代碼:
/**
Server:LightTPD/1.4.28(Win32)
X-Powered-By:PHP/5.3.27
*/
echo'before';
ob_end_clean();
echostr_pad('',4096)."\n";
for($i=10;$i>0;$i--)
{
flush();
echo$i;
sleep(1);
}
加上flush(),就會(huì )一行一行輸出。假如把ob_end_clean換成ob_end_flush會(huì )把before輸出來(lái)。
其他函數可參考手冊,比較簡(jiǎn)單。
總結
php腳本到瀏覽器,要經(jīng)過(guò)phpbuffer=》webserverbuffer=》browserbuffer。最后顯示到瀏覽器。缺一不可。所以大家要ob_flush和flush以及加上echostr_pad(”,4096)才能調試出你想要的效果。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站