亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

剖析 PHP 中的輸出緩沖

 更新時(shí)間:2006年12月21日 00:00:00   作者:  
我們先來(lái)看一段代碼:

    〈?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判斷/計(jì)算閏年的方法小結(jié)【三種方法】

    php判斷/計(jì)算閏年的方法小結(jié)【三種方法】

    這篇文章主要介紹了php判斷/計(jì)算閏年的方法,結(jié)合實(shí)例形式總結(jié)分析了三種計(jì)閏年的判斷方法,需要的朋友可以參考下
    2019-07-07
  • PHP 錯(cuò)誤之引號(hào)中使用變量

    PHP 錯(cuò)誤之引號(hào)中使用變量

    當(dāng)看到錯(cuò)誤提示 syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
    2009-05-05
  • php批量刪除數(shù)據(jù)

    php批量刪除數(shù)據(jù)

    php批量刪除數(shù)據(jù)...
    2007-01-01
  • php操作redis常見(jiàn)方法示例【key與value操作】

    php操作redis常見(jiàn)方法示例【key與value操作】

    這篇文章主要介紹了php操作redis常見(jiàn)方法,結(jié)合實(shí)例形式分析了PHP針對(duì)Redis key與value的各種常見(jiàn)操作技巧,需要的朋友可以參考下
    2020-04-04
  • PHP獲取QQ達(dá)人QQ信息的方法

    PHP獲取QQ達(dá)人QQ信息的方法

    這篇文章主要介紹了PHP獲取QQ達(dá)人QQ信息的方法,實(shí)例分析了php獲取QQ信息的原理與對(duì)應(yīng)的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • php natsort內(nèi)核函數(shù)淺析

    php natsort內(nèi)核函數(shù)淺析

    今天發(fā)現(xiàn)了php有個(gè)自然排序的函數(shù)----natsort,第一次聽(tīng)說(shuō)了原來(lái)還有一種叫做“自然排序”的算法,很好奇
    2009-08-08
  • golang與php實(shí)現(xiàn)計(jì)算兩個(gè)經(jīng)緯度之間距離的方法

    golang與php實(shí)現(xiàn)計(jì)算兩個(gè)經(jīng)緯度之間距離的方法

    這篇文章主要介紹了golang與php實(shí)現(xiàn)計(jì)算兩個(gè)經(jīng)緯度之間距離的方法,結(jié)合實(shí)例形式對(duì)比分析了Go語(yǔ)言與php進(jìn)行經(jīng)緯度計(jì)算的相關(guān)數(shù)學(xué)運(yùn)算技巧,需要的朋友可以參考下
    2016-07-07
  • PhpStorm配置debug環(huán)境的詳細(xì)過(guò)程

    PhpStorm配置debug環(huán)境的詳細(xì)過(guò)程

    在開(kāi)發(fā)php項(xiàng)目的時(shí)候,有時(shí)候不知道明確的錯(cuò)誤在哪里,想要用java或者c#那樣能夠開(kāi)啟debug斷點(diǎn)分步調(diào)試,下面這篇文章主要給大家介紹了關(guān)于PhpStorm配置debug環(huán)境的詳細(xì)過(guò)程,需要的朋友可以參考下
    2023-01-01
  • PHP設(shè)計(jì)模式之觀察者模式定義與用法分析

    PHP設(shè)計(jì)模式之觀察者模式定義與用法分析

    這篇文章主要介紹了PHP設(shè)計(jì)模式之觀察者模式定義與用法,結(jié)合實(shí)例形式分析了php觀察者模式的概念、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-04-04
  • php Yii2框架創(chuàng)建定時(shí)任務(wù)方法詳解

    php Yii2框架創(chuàng)建定時(shí)任務(wù)方法詳解

    Yii2是一個(gè)基于組件、用于開(kāi)發(fā)大型Web應(yīng)用的高性能PHP框架,采用嚴(yán)格的OOP編寫(xiě),并有著完善的庫(kù)引用以及全面的教程,該框架提供了Web 2.0應(yīng)用開(kāi)發(fā)所需要的幾乎一切功能,是最有效率的PHP框架之一
    2022-09-09

最新評(píng)論