最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php flush類輸出緩沖剖析

 更新時(shí)間:2008年10月19日 11:48:08   作者:  
該函數(shù)將當(dāng)前為止程序的所有輸出發(fā)送到用戶的瀏覽器。

<?php
for ($i=10; $i>0; $i--)
{
echo $i;
flush();
sleep(1);
}
?>
按照php手冊(cè)里的說(shuō)法
該函數(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。
打開(kāi)php.ini,搜索output_buffering,我們會(huì)看到類似這樣的設(shè)置 output_buffering = 4096。正如它的名字output_buffering一樣,這個(gè)設(shè)置的作用就是把輸出緩沖一下,緩沖大小為4096bytes.
在我們的第一段代碼里,之所以沒(méi)有按預(yù)期的輸出,正是因?yàn)檫@個(gè)output_buffering把那些輸出都緩沖了。沒(méi)達(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)樵谀_本一開(kāi)始的時(shí)候,緩沖設(shè)置就已經(jīng)被載入,然后緩沖就開(kāi)始了。
可能你會(huì)問(wèn)了,既然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),后者是把不在緩沖中的或者說(shuō)是被釋放出來(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();
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ò)串口實(shí)現(xiàn)發(fā)送短信

    PHP通過(guò)串口實(shí)現(xiàn)發(fā)送短信

    本文給大家詳細(xì)介紹了,如何使用php通過(guò)串口來(lái)實(shí)現(xiàn)發(fā)送短信的思路以及具體的實(shí)現(xiàn)代碼,十分的實(shí)用,有需要的小伙伴可以參考下。
    2015-07-07
  • php版微信自定義回復(fù)功能示例

    php版微信自定義回復(fù)功能示例

    這篇文章主要介紹了php版微信自定義回復(fù)功能,結(jié)合完整實(shí)例形式分析了php版微信自定義回復(fù)功能的設(shè)置與代碼實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-12-12
  • php使用Jpgraph繪制復(fù)雜X-Y坐標(biāo)圖的方法

    php使用Jpgraph繪制復(fù)雜X-Y坐標(biāo)圖的方法

    這篇文章主要介紹了php使用Jpgraph繪制復(fù)雜X-Y坐標(biāo)圖的方法,通過(guò)設(shè)置圖像陰影、邊距、字體、顏色、曲線等實(shí)現(xiàn)Jpgraph繪制復(fù)雜坐標(biāo)圖的功能,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2015-06-06
  • PHP設(shè)計(jì)模式之裝飾者模式代碼實(shí)例

    PHP設(shè)計(jì)模式之裝飾者模式代碼實(shí)例

    這篇文章主要介紹了PHP設(shè)計(jì)模式之裝飾者模式代碼實(shí)例,裝飾者模式就是不修改原類代碼和繼承的情況下動(dòng)態(tài)擴(kuò)展類的功能,本文就給出了代碼實(shí)例,需要的朋友可以參考下
    2015-05-05
  • Php連接及讀取和寫(xiě)入mysql數(shù)據(jù)庫(kù)的常用代碼

    Php連接及讀取和寫(xiě)入mysql數(shù)據(jù)庫(kù)的常用代碼

    既然現(xiàn)在你看到了這篇文章,說(shuō)明你肯定知道PHP和MySQL是怎么一回事,我就不啰嗦了。但為什么你還要繼續(xù)閱讀此文呢?可能是以前你習(xí)慣復(fù)制粘貼一些代碼,并沒(méi)有真正弄懂代碼的含義;也可能你以前弄懂了,但像我一樣,有一段時(shí)間沒(méi)有接觸,生疏了
    2014-08-08
  • PHP中include和require的使用詳解

    PHP中include和require的使用詳解

    這篇文章主要介紹了PHP中include和require的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用PHP,感興趣的朋友可以了解下
    2021-04-04
  • php+ajax無(wú)刷新分頁(yè)實(shí)例詳解

    php+ajax無(wú)刷新分頁(yè)實(shí)例詳解

    這篇文章主要介紹了php+ajax無(wú)刷新分頁(yè)的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了php數(shù)據(jù)查詢結(jié)合ajax數(shù)據(jù)交互實(shí)現(xiàn)無(wú)刷新分頁(yè)效果的相關(guān)技巧,需要的朋友可以參考下
    2015-12-12
  • PHP實(shí)現(xiàn)Soap通訊的方法

    PHP實(shí)現(xiàn)Soap通訊的方法

    這篇文章主要介紹了PHP實(shí)現(xiàn)Soap通訊的方法,是web service的一個(gè)典型應(yīng)用,需要的朋友可以參考下
    2014-11-11
  • PHP 巧用數(shù)組降低程序的時(shí)間復(fù)雜度

    PHP 巧用數(shù)組降低程序的時(shí)間復(fù)雜度

    通常開(kāi)發(fā)人員在寫(xiě)程序的時(shí)候,往往是把已經(jīng)設(shè)計(jì)好或者構(gòu)思好的運(yùn)算邏輯,直接用編程語(yǔ)言翻譯出來(lái)。
    2010-01-01
  • MongoDB在PHP中的常用操作小結(jié)

    MongoDB在PHP中的常用操作小結(jié)

    本篇文章主要是對(duì)MongoDB在PHP中的常用操作進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-02-02

最新評(píng)論

故城县| 内江市| 永胜县| 庆安县| 富蕴县| 龙川县| 搜索| 通江县| 历史| 进贤县| 自贡市| 广灵县| 施秉县| 苏尼特右旗| 怀安县| 荆门市| 合山市| 安多县| 子长县| 甘泉县| 孟州市| 监利县| 化州市| 理塘县| 漠河县| 石首市| 淳安县| 沁源县| 昌江| 皮山县| 萨嘎县| 平原县| 磐石市| 鹤壁市| 盘锦市| 海兴县| 赫章县| 新宁县| 突泉县| 甘谷县| 金乡县|