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

按照php手冊里的說法,該函數將當前為止程序的所有輸出發送到用戶的瀏覽器 " /> japanese黑人高清,成人丁香婷婷,jizzjizz日本护士出水视频

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

剖析 PHP 中的輸出緩沖

我們先來看一段代碼:

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

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

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

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

    〈?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);
    }
    ?〉
    運行一下,是不是發現$i也隔一秒輸出一次了?這是為什么呢?
    別急,我們來看看php.ini。

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

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

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

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

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

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

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

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

    以上所訴可能在某些瀏覽器中不成立。因為瀏覽器也有自己的規則。我是用Firefox1.5,IE6,opera8.5來測試的。其中opera就不能正常輸出,因為它有一個規則,就是不遇到一個HTML標簽,就絕對不輸出,除非到腳本結束。而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“;
    ?〉 

php技術剖析 PHP 中的輸出緩沖,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 国内精品久久久久久野外 | 国产美女激情视频无打码 | 日本精品视频一区二区三区 | 91青青国产在线观看免费 | 韩国三级日本三级美三级 | 在线观看免费视频网站色 | 91视频亚洲 | 国产成人小视频在线观看 | 久久97久久97精品免视看清纯 | 欧美一级艳片爽快片 | 亚1洲二区三区四区免费 | 国产精品极品美女自在线看免费一区二区 | 伊人网站在线观看 | 中文字幕在线有码 | 国产一级特黄aa级特黄裸毛片 | 久久99国产一区二区三区 | 色婷婷亚洲综合五月 | 992tv又爽又黄的免费视频 | 天天爽天天乐 | 久久国内精品自在自线400部o | 国产乱子伦真实china | 日本波多野结衣在线 | 黄色片网站在线免费观看 | 青草悠悠视频在线观看 | 福利色播| 亚洲区激情区图片小说区 | 久久韩国精品韩国专区 | 国产精品一页 | 91亚洲免费视频 | 婷婷丁香在线 | 91香蕉国产亚洲一二三区 | 亚洲一区二区成人 | 美女被男人扒开腿猛网站 | 狠狠操操操 | 亚洲国产成人久久笫一页 | 亚洲无吗在线视频 | 区二区三区四区免费视频 | 欧美激情性色生活片在线观看 | 日韩激情中文字幕一区二区 | 青青热久久综合网伊人 | 女子毛片 |