PHP緩沖區(qū)用法總結(jié)
本文實(shí)例總結(jié)了PHP緩沖區(qū)用法。分享給大家供大家參考,具體如下:
我們先來(lái)看一段代碼。
<?php for ($i=10; $i>0; $i--) { echo $i; flush(); sleep(1); } ?>
該函數(shù)將當(dāng)前為止程序的所有輸出發(fā)送到用戶的瀏覽器。
上面的這段代碼,應(yīng)該隔一秒鐘輸出一次$i。但是實(shí)際中卻不一定是這樣。有可能是等了10秒鐘后,所有的輸出同時(shí)呈現(xiàn)出來(lái)。
好,我們來(lái)改一下這段代碼,改成
<?php ob_end_clean();//修改部分 for ($i=10; $i>0; $i--) { echo $i; flush(); sleep(1); } ?>
嘿,加了這一句ob_end_clean();,居然就OK了。實(shí)際上,我們把ob_end_clean()換成ob_end_flush()也一樣OK。
我再來(lái)改一改。
<?php for ($i=10; $i>0; $i--) { echo $i; ob_flush();//修改部分 flush(); sleep(1); } ?>
運(yùn)行一下,是不是發(fā)現(xiàn)$i也隔一秒輸出一次了?這是為什么呢?
別急,我們來(lái)看看php.ini。
打開php.ini,搜索output_buffering,我們會(huì)看到類似這樣的設(shè)置 output_buffering = 4096。正如它的名字output_buffering一樣,這個(gè)設(shè)置的作用就是把輸出緩沖一下,緩沖大小為4096bytes.
在我們的第一段代碼里,之所以沒有按預(yù)期的輸出,正是因?yàn)檫@個(gè)output_buffering把那些輸出都緩沖了。沒達(dá)到4096bytes或者腳本結(jié)束,輸出是不會(huì)被發(fā)送出去的。
而第二段代碼中的ob_end_clean()和ob_end_flush()的作用,就是終止緩沖。這樣就不用等到有4096bytes的緩沖之后才被發(fā)送出去了。
第三段代碼中,用了一句ob_flush(),它的作用就是把緩沖的數(shù)據(jù)發(fā)送出去,但是并不會(huì)終止緩沖,所以它必須在每次flush()前使用。
如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我們就必須把php.ini里的output_buffering設(shè)得足夠小,例如設(shè)為0。需要注意的是,如果你打算在腳本中使用ini_set("output_buffering","0″)來(lái)設(shè)置,那么請(qǐng)停下來(lái)吧,這種方法是不行的。因?yàn)樵谀_本一開始的時(shí)候,緩沖設(shè)置就已經(jīng)被載入,然后緩沖就開始了。
可能你會(huì)問了,既然ob_flush()是把緩沖的數(shù)據(jù)發(fā)送出去,那么為什么還需要用flush()???直接用下面這段代碼不行嗎??
<?php for ($i=10; $i>0; $i--) { echo $i; ob_flush(); sleep(1); } ?>
請(qǐng)注意ob_flush()和flush()的區(qū)別。前者是把數(shù)據(jù)從PHP的緩沖中釋放出來(lái),后者是把不在緩沖中的或者說是被釋放出來(lái)的數(shù)據(jù)發(fā)送到瀏覽器。所以當(dāng)緩沖存在的時(shí)候,我們必須ob_flush()和flush()同時(shí)使用。
那是不是flush()在這里就是不可缺少的呢?不是的,我們還有另外一種方法,使得當(dāng)有數(shù)據(jù)輸出的時(shí)候,馬上被發(fā)送到瀏覽器。下面這兩段代碼就是不需要使用flush()了。(當(dāng)你把output_buffering設(shè)為0的時(shí)候,連ob_flush()和ob_end_clean()都不需要了)
<?php ob_implicit_flush(true); for ($i=10; $i>0; $i--) { echo $i; ob_flush(); #如果ob函數(shù)打開的情況下 sleep(1); } ?>
<?php ob_end_clean(); ob_implicit_flush(true); for ($i=10; $i>0; $i--) { echo $i; sleep(1); } ?>
請(qǐng)注意看上面的ob_implicit_flush(true),這個(gè)函數(shù)強(qiáng)制每當(dāng)有輸出的時(shí)候,即刻把輸出發(fā)送到瀏覽器。這樣就不需要每次輸出(echo)后,都用flush()來(lái)發(fā)送到瀏覽器了。
以上所訴可能在某些瀏覽器中不成立。因?yàn)闉g覽器也有自己的規(guī)則。我是用Firefox1.5,IE6,opera8.5來(lái)測(cè)試的。其中opera就不能正常輸出,因?yàn)樗幸粋€(gè)規(guī)則,就是不遇到一個(gè)HTML標(biāo)簽,就絕對(duì)不輸出,除非到腳本結(jié)束。而FireFox和IE還算比較正常的。
最后附上一段非常有趣的代碼,作者為PuTTYshell。在一個(gè)腳本周期里,每次輸出,都會(huì)把前一次的輸出覆蓋掉。
以下代碼只在firefox下可用,其他瀏覽器并不支持multipart/x-mixed-replace的Content-Type.
<?php header('Content-type: multipart/x-mixed-replace;boundary=endofsection'); print "\n--endofsection\n"; $pmt = array("-", "\\", "|", "/" ); for( $i = 0; $i <10; $i ++ ){ sleep(1); print "Content-type: text/plain\n\n"; print "Part $i\t".$pmt[$i % 4]; print "--endofsection\n"; ob_flush(); flush(); } print "Content-type: text/plain\n\n"; print "The end\n"; print "--endofsection--\n"; ?>
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP基本語(yǔ)法入門教程》、《PHP錯(cuò)誤與異常處理方法總結(jié)》及《php常用函數(shù)與技巧總結(jié)》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
php bootstrap實(shí)現(xiàn)簡(jiǎn)單登錄
這篇文章主要為大家詳細(xì)介紹了php bootstrap實(shí)現(xiàn)簡(jiǎn)單登錄的具體方法,感興趣的小伙伴們可以參考一下2016-03-03深入理解PHP中的static和yield關(guān)鍵字
這篇文章主要給大家介紹了關(guān)于PHP中static和yield關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用php具有一定的參考學(xué)習(xí)價(jià)值,文章需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09詳解PHP json_decode()函數(shù)的使用方法
PHP中的json_decode()函數(shù)是用于將JSON字符串解碼為PHP變量的函數(shù),它將JSON字符串轉(zhuǎn)換為與其對(duì)應(yīng)的PHP數(shù)據(jù)類型,例如,將JSON字符串轉(zhuǎn)換為關(guān)聯(lián)數(shù)組、對(duì)象或其他數(shù)據(jù)類型,本文就給大家介紹一下PHP json_decode()函數(shù)的使用方法,需要的朋友可以參考下2023-08-08特詳細(xì)的PHPMYADMIN簡(jiǎn)明安裝教程
簡(jiǎn)單的說,phpmyadmin就是一種mysql的管理工具,安裝該工具后,即可以通過web形式直接管理mysql數(shù)據(jù),而不需要通過執(zhí)行系統(tǒng)命令來(lái)管理,2008-08-08PHP縮略圖等比例無(wú)損壓縮,可填充空白區(qū)域補(bǔ)充色
PHP縮略圖 等比例無(wú)損壓縮,可填充空白區(qū)域補(bǔ)充色的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-06-06PHP跳出for循環(huán)中的break和continue
在PHP中,可以使用break關(guān)鍵字來(lái)跳出循環(huán),,PHP中還可以使用continue關(guān)鍵字跳過本次循環(huán)并繼續(xù)執(zhí)行下一次循環(huán),當(dāng)循環(huán)執(zhí)行到continue語(yǔ)句時(shí),本次循環(huán)中continue之后的代碼將不再執(zhí)行,直接進(jìn)入下一次循環(huán)2023-09-09自寫的利用PDO對(duì)mysql數(shù)據(jù)庫(kù)增刪改查操作類
這篇文章主要給大家介紹了關(guān)于自寫的利用PDO對(duì)mysql數(shù)據(jù)庫(kù)的增刪改查操作類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02