乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      剖析PHP中的輸出緩沖

       Ralf_Jones 2006-01-18
      剖析PHP中的輸出緩沖

      我們先來看一段代碼。

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

      按照php手冊里的說法

      該函數將當前為止程序的所有輸出發(fā)送到用戶的瀏覽器。

      上面的這段代碼,應該隔一秒鐘輸出一次$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);
      }
      ?>

      運行一下,是不是發(fā)現$i也隔一秒輸出一次了?這是為什么呢?
      別急,我們來看看php.ini。

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

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

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

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

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

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

      <?php
      for ($i=10; $i>0; $i--)
      {
      	echo $i;
      	ob_flush();
      	sleep(1);
      }
      ?>

      請注意ob_flush()和flush()的區(qū)別。前者是把數據從PHP的緩沖中釋放出來,后者是把不在緩沖中的或者說是被釋放出來的數據發(fā)送到瀏覽器。所以當緩沖存在的時候,我們必須ob_flush()和flush()同時使用。

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

      以上所訴可能在某些瀏覽器中不成立。因為瀏覽器也有自己的規(guī)則。我是用Firefox1.5,IE6,opera8.5來測試的。其中opera就不能正常輸出,因為它有一個規(guī)則,就是不遇到一個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";
      ?>

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多