欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP緩沖區(qū)用法總結(jié)

 更新時(shí)間:2016年02月14日 09:56:52   作者:思齊_  
這篇文章主要介紹了PHP緩沖區(qū)用法,結(jié)合實(shí)例形式總結(jié)分析了PHP緩沖區(qū)的功能、使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例總結(jié)了PHP緩沖區(qū)用法。分享給大家供大家參考,具體如下:

我們先來(lái)看一段代碼。

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

按照php手冊(cè)里的說法

該函數(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。

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

在我們的第一段代碼里,之所以沒有按預(yù)期的輸出,正是因?yàn)檫@個(gè)output_buffering把那些輸出都緩沖了。沒達(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)樵谀_本一開始的時(shí)候,緩沖設(shè)置就已經(jīng)被載入,然后緩沖就開始了。

可能你會(huì)問了,既然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),后者是把不在緩沖中的或者說是被釋放出來(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(); #如果ob函數(shù)打開的情況下
  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ān)內(nèi)容感興趣的讀者可查看本站專題:《PHP基本語(yǔ)法入門教程》、《PHP錯(cuò)誤與異常處理方法總結(jié)》及《php常用函數(shù)與技巧總結(jié)

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • php bootstrap實(shí)現(xiàn)簡(jiǎn)單登錄

    php bootstrap實(shí)現(xiàn)簡(jiǎn)單登錄

    這篇文章主要為大家詳細(xì)介紹了php bootstrap實(shí)現(xiàn)簡(jiǎn)單登錄的具體方法,感興趣的小伙伴們可以參考一下
    2016-03-03
  • PHP的Trait機(jī)制原理與用法分析

    PHP的Trait機(jī)制原理與用法分析

    這篇文章主要介紹了PHP的Trait機(jī)制原理與用法,結(jié)合實(shí)例形式分析了PHP Trait機(jī)制的基本功能、原理及簡(jiǎn)單使用技巧,需要的朋友可以參考下
    2019-10-10
  • 深入理解PHP中的static和yield關(guān)鍵字

    深入理解PHP中的static和yield關(guān)鍵字

    這篇文章主要給大家介紹了關(guān)于PHP中static和yield關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用php具有一定的參考學(xué)習(xí)價(jià)值,文章需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 用PHP代替JS玩轉(zhuǎn)DOM的思路及示例代碼

    用PHP代替JS玩轉(zhuǎn)DOM的思路及示例代碼

    思路就是通過DOMDocument將一個(gè)html file轉(zhuǎn)換成DOM樹的數(shù)據(jù)結(jié)構(gòu),再用DOMXPath的實(shí)例去搜索這個(gè)DOM樹,接下來(lái)就可以對(duì)當(dāng)前節(jié)點(diǎn)的子樹進(jìn)行遍歷
    2014-06-06
  • 詳解PHP json_decode()函數(shù)的使用方法

    詳解PHP json_decode()函數(shù)的使用方法

    PHP中的json_decode()函數(shù)是用于將JSON字符串解碼為PHP變量的函數(shù),它將JSON字符串轉(zhuǎn)換為與其對(duì)應(yīng)的PHP數(shù)據(jù)類型,例如,將JSON字符串轉(zhuǎn)換為關(guān)聯(lián)數(shù)組、對(duì)象或其他數(shù)據(jù)類型,本文就給大家介紹一下PHP json_decode()函數(shù)的使用方法,需要的朋友可以參考下
    2023-08-08
  • 特詳細(xì)的PHPMYADMIN簡(jiǎn)明安裝教程

    特詳細(xì)的PHPMYADMIN簡(jiǎn)明安裝教程

    簡(jiǎn)單的說,phpmyadmin就是一種mysql的管理工具,安裝該工具后,即可以通過web形式直接管理mysql數(shù)據(jù),而不需要通過執(zhí)行系統(tǒng)命令來(lái)管理,
    2008-08-08
  • php判斷并刪除空目錄及空子目錄的方法

    php判斷并刪除空目錄及空子目錄的方法

    這篇文章主要介紹了php判斷并刪除空目錄及空子目錄的方法,可實(shí)現(xiàn)遍歷目標(biāo)文件夾判斷是否為空及刪除空目錄的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • PHP縮略圖等比例無(wú)損壓縮,可填充空白區(qū)域補(bǔ)充色

    PHP縮略圖等比例無(wú)損壓縮,可填充空白區(qū)域補(bǔ)充色

    PHP縮略圖 等比例無(wú)損壓縮,可填充空白區(qū)域補(bǔ)充色的實(shí)現(xiàn)代碼,需要的朋友可以參考下。
    2011-06-06
  • PHP跳出for循環(huán)中的break和continue

    PHP跳出for循環(huán)中的break和continue

    在PHP中,可以使用break關(guān)鍵字來(lái)跳出循環(huán),,PHP中還可以使用continue關(guān)鍵字跳過本次循環(huán)并繼續(xù)執(zhí)行下一次循環(huán),當(dāng)循環(huán)執(zhí)行到continue語(yǔ)句時(shí),本次循環(huán)中continue之后的代碼將不再執(zhí)行,直接進(jìn)入下一次循環(huán)
    2023-09-09
  • 自寫的利用PDO對(duì)mysql數(shù)據(jù)庫(kù)增刪改查操作類

    自寫的利用PDO對(duì)mysql數(shù)據(jù)庫(kù)增刪改查操作類

    這篇文章主要給大家介紹了關(guān)于自寫的利用PDO對(duì)mysql數(shù)據(jù)庫(kù)的增刪改查操作類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02

最新評(píng)論