詳情描述
緩沖輸出
ltphp
echo i
flush()
sleep(1)
gt按照php手冊里的說法
該函數(shù)將當(dāng)前為止程序的所有輸出發(fā)送到用戶的瀏覽器。
上面的這段代碼,應(yīng)該隔一秒鐘輸出一次i。但是實(shí)際中卻不一定是這樣。有可能是等了10秒鐘后,所有的輸出同時呈現(xiàn)出來。
好,我們來改一下這段代碼,改成
ltphp
修改部分
echo i
flush()
sleep(1)
gt嘿,加了這一句居然就OK了。實(shí)際上,我們把換成也一樣OK。
我再來改一改。
ltphp
echo i
修改部分
flush()
sleep(1)
gt運(yùn)行一下,是不是發(fā)現(xiàn)i也隔一秒輸出一次了?這是為什么呢?
別急,我們來看看php.ini。
打開php.ini,搜索我們會看到類似這樣的設(shè)置 正如它的名字樣,這個設(shè)置的作用就是把輸出緩沖一下,緩沖大小為
在我們的第一段代碼里,之所以沒有按預(yù)期的輸出,正是因?yàn)檫@個把那些輸出都緩沖了。沒達(dá)到或者腳本結(jié)束,輸出是不會被發(fā)送出去的。
而第二段代碼中的和的作用,就是終止緩沖。這樣就不用等到有的緩沖之后才被發(fā)送出去了。
第三段代碼中,用了一句它的作用就是把緩沖的數(shù)據(jù)發(fā)送出去,但是并不會終止緩沖,所以它必須在每次flush()前使用。
如果不想使用和我們就必須把php.ini里的設(shè)得足夠小,例如設(shè)為0。需要注意的是,如果你打算在腳本中使用iniset(””,”0)來設(shè)置,那么請停下來吧,這種方法是不行的。因?yàn)樵谀_本一開始的時候,緩沖設(shè)置就已經(jīng)被載入,然后緩沖就開始了。
可能你會問了,既然是把緩沖的數(shù)據(jù)發(fā)送出去,那么為什么還需要用flush()直接用下面這段代碼不行嗎??
ltphp
echo i
sleep(1)
gt請注意和flush()的區(qū)別。前者是把數(shù)據(jù)從PHP的緩沖中釋放出來,后者是把不在緩沖中的或者說是被釋放出來的數(shù)據(jù)發(fā)送到瀏覽器。所以當(dāng)緩沖存在的時候,我們必須和flush()同時使用。
那是不是flush()在這里就是不可缺少的呢?不是的,我們還有另外一種方法,使得當(dāng)有數(shù)據(jù)輸出的時候,馬上被發(fā)送到瀏覽器。下面這兩段代碼就是不需要使用flush()了。(當(dāng)你把outputbuffering設(shè)為0的時候,連和都不需要了)
ltphp
obimplicitflush(true)
echo i
sleep(1)
gtltphp
obimplicitflush(true)
for (i10 igt0 i--) [Page]
echo i
sleep(1)
gt請注意看上面的obimplicitflush(true),這個函數(shù)強(qiáng)制每當(dāng)有輸出的時候,即刻把輸出發(fā)送到瀏覽器。這樣就不需要每次輸出(echo)后,都用flush()來發(fā)送到瀏覽器了。
具體內(nèi)容請參考學(xué)校: 或者直北京)北大青鳥旗艦校區(qū)學(xué)計算機(jī)、IT電腦、軟件工程師、網(wǎng)絡(luò)營銷師、網(wǎng)絡(luò)工程師、程序員、java、.net、PHP、編程、淘寶、電商 應(yīng)有盡有,教學(xué)質(zhì)量高、師資力量雄厚專家授課,讓你學(xué)的放心。