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

剖析 PHP 中的輸出緩沖

 更新時間:2006年12月21日 00:00:00   作者:  
我們先來看一段代碼:

    〈?php
    for ($i=10; $i〉0; $i--)
    {
     echo $i;
     flush();
     sleep(1);
    }
    ?〉

    按照php手冊里的說法,該函數(shù)將當(dāng)前為止程序的所有輸出發(fā)送到用戶的瀏覽器。

    上面的這段代碼,應(yīng)該隔一秒鐘輸出一次$i。但是實際中卻不一定是這樣。有可能是等了10秒鐘后,所有的輸出同時呈現(xiàn)出來。

    好,我們來改一下這段代碼,改成

    〈?php
    ob_end_clean();//修改部分
    for ($i=10; $i〉0; $i--)
    {
     echo $i;
     flush();
     sleep(1);
    }
    ?〉
    嘿,加了這一句ob_end_clean();,居然就OK了。實際上,我們把ob_end_clean()換成ob_end_flush()也一樣OK。

    我再來改一改。

    〈?php
    for ($i=10; $i〉0; $i--)
    {
     echo $i;
     ob_flush();//修改部分
     flush();
     sleep(1);
    }
    ?〉
    運行一下,是不是發(fā)現(xiàn)$i也隔一秒輸出一次了?這是為什么呢?
    別急,我們來看看php.ini。

    打開php.ini,搜索output_buffering,我們會看到類似這樣的設(shè)置 output_buffering = 4096。正如它的名字output_buffering一樣,這個設(shè)置的作用就是把輸出緩沖一下,緩沖大小為4096bytes.

    在我們的第一段代碼里,之所以沒有按預(yù)期的輸出,正是因為這個output_buffering把那些輸出都緩沖了。沒達(dá)到4096bytes或者腳本結(jié)束,輸出是不會被發(fā)送出去的。

    而第二段代碼中的ob_end_clean()和ob_end_flush()的作用,就是終止緩沖。這樣就不用等到有4096bytes的緩沖之后才被發(fā)送出去了。

    第三段代碼中,用了一句ob_flush(),它的作用就是把緩沖的數(shù)據(jù)發(fā)送出去,但是并不會終止緩沖,所以它必須在每次flush()前使用。

    如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我們就必須把php.ini里的output_buffering設(shè)得足夠小,例如設(shè)為0。需要注意的是,如果你打算在腳本中使用ini_set(”output_buffering”,”0″)來設(shè)置,那么請停下來吧,這種方法是不行的。因為在腳本一開始的時候,緩沖設(shè)置就已經(jīng)被載入,然后緩沖就開始了。

    可能你會問了,既然ob_flush()是把緩沖的數(shù)據(jù)發(fā)送出去,那么為什么還需要用flush()???直接用下面這段代碼不行嗎??

    〈?php
    for ($i=10; $i〉0; $i--)
    {
     echo $i;
     ob_flush();
     sleep(1);
    }
    ?〉
    請注意ob_flush()和flush()的區(qū)別。前者是把數(shù)據(jù)從PHP的緩沖中釋放出來,后者是把不在緩沖中的或者說是被釋放出來的數(shù)據(jù)發(fā)送到瀏覽器。所以當(dāng)緩沖存在的時候,我們必須ob_flush()和flush()同時使用。

    那是不是flush()在這里就是不可缺少的呢?不是的,我們還有另外一種方法,使得當(dāng)有數(shù)據(jù)輸出的時候,馬上被發(fā)送到瀏覽器。下面這兩段代碼就是不需要使用flush()了。(當(dāng)你把output_buffering設(shè)為0的時候,連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);
    }
    ?〉
    請注意看上面的ob_implicit_flush(true),這個函數(shù)強制每當(dāng)有輸出的時候,即刻把輸出發(fā)送到瀏覽器。這樣就不需要每次輸出(echo)后,都用flush()來發(fā)送到瀏覽器了。

    以上所訴可能在某些瀏覽器中不成立。因為瀏覽器也有自己的規(guī)則。我是用Firefox1.5,IE6,opera8.5來測試的。其中opera就不能正常輸出,因為它有一個規(guī)則,就是不遇到一個HTML標(biāo)簽,就絕對不輸出,除非到腳本結(jié)束。而FireFox和IE還算比較正常的。

    最后附上一段非常有趣的代碼,作者為PuTTYshell。在一個腳本周期里,每次輸出,都會把前一次的輸出覆蓋掉。
    以下代碼只在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+JS實現(xiàn)大規(guī)模數(shù)據(jù)提交的方法

    PHP+JS實現(xiàn)大規(guī)模數(shù)據(jù)提交的方法

    這篇文章主要介紹了PHP+JS實現(xiàn)大規(guī)模數(shù)據(jù)提交的方法,以一個短信群發(fā)系統(tǒng)實例分析了php大規(guī)模數(shù)據(jù)提交的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • 解析CodeIgniter自定義配置文件

    解析CodeIgniter自定義配置文件

    本篇文章是對CodeIgniter自定義配置文件進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • php進(jìn)程daemon化的正確實現(xiàn)方法

    php進(jìn)程daemon化的正確實現(xiàn)方法

    守護(hù)進(jìn)程(Daemon)是運行在后臺的一種特殊進(jìn)程。下面這篇文章主要給大家介紹了關(guān)于php進(jìn)程daemon化的正確實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • PHP最常用的ini函數(shù)分析 針對PHP.ini配置文件

    PHP最常用的ini函數(shù)分析 針對PHP.ini配置文件

    php的配置函數(shù)就是幾個ini_*的函數(shù),主要是針對配置文件的操作,其實就四個函數(shù):ini_get、ini_set、ini_get_all、ini_restore。個人感覺最有用的就是ini_set和ini_get。
    2010-04-04
  • PHP中的float類型使用說明

    PHP中的float類型使用說明

    使用PHP的float類型需要注意的是:PHP的float類型的精度有點問題。如果需要高精度的數(shù)學(xué)計算,可以使用php提供的專用的數(shù)學(xué)函數(shù) arbitrary precision math functions系列和gmp系列函數(shù)。
    2010-07-07
  • 解析php中的escape函數(shù)

    解析php中的escape函數(shù)

    本篇文章是對php中的escape函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • php遞歸調(diào)用刪除數(shù)組空值元素的方法

    php遞歸調(diào)用刪除數(shù)組空值元素的方法

    這篇文章主要介紹了php遞歸調(diào)用刪除數(shù)組空值元素的方法,涉及php遞歸調(diào)用操作數(shù)組的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • PHP Global變量定義當(dāng)前頁面的全局變量實現(xiàn)探討

    PHP Global變量定義當(dāng)前頁面的全局變量實現(xiàn)探討

    我們在這篇文章中就針對PHP Global變量出現(xiàn)的問題給出了一些具體的解決辦法,感興趣的朋友可以參考下哈
    2013-06-06
  • php基礎(chǔ)知識:函數(shù)基礎(chǔ)知識

    php基礎(chǔ)知識:函數(shù)基礎(chǔ)知識

    php基礎(chǔ)知識:函數(shù)基礎(chǔ)知識...
    2006-12-12
  • php cookie使用方法學(xué)習(xí)筆記分享

    php cookie使用方法學(xué)習(xí)筆記分享

    在php中cookie與其它程序中沒什么兩樣,cookie都是用來存儲信息到客戶端,常用用于安全性要求不高的一些應(yīng)用中,如用戶登錄記住密碼之類的,下面我來給大家介紹一下php cookie學(xué)習(xí)筆記
    2013-11-11

最新評論

响水县| 紫阳县| 广南县| 枣强县| 开鲁县| 邯郸县| 兰溪市| 泽普县| 绥中县| 三都| 葫芦岛市| 石河子市| 阜城县| 宁陕县| 佛教| 东兰县| 芦山县| 平果县| 庄河市| 太和县| 紫阳县| 晋江市| 洛隆县| 景谷| 珠海市| 二手房| 鄂州市| 基隆市| 郑州市| 宜宾市| 霍城县| 洪泽县| 海城市| 沽源县| 河西区| 大城县| 黑河市| 长丰县| 宁远县| 新河县| 靖远县|