《PHP實例:PHP緩沖區用法總結》要點:
本文介紹了PHP實例:PHP緩沖區用法總結,希望對您有用。如果有疑問,可以聯系我們。
本文實例總結了PHP緩沖區用法.分享給大家供大家參考,具體如下:PHP實戰
我們先來看一段代碼.PHP實戰
<?php for ($i=10; $i>0; $i--) { echo $i; flush(); sleep(1); } ?>
依照php手冊里的說法:PHP實戰
該函數將當前為止程序的所有輸出發送到用戶的瀏覽器.PHP實戰
上面的這段代碼,應該隔一秒鐘輸出一次$i.但是實際中卻不一定是這樣.有可能是等了10秒鐘后,所有的輸出同時呈現出來.PHP實戰
好,我們來改一下這段代碼,改成PHP實戰
<?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實戰
我再來改一改.PHP實戰
<?php for ($i=10; $i>0; $i--) { echo $i; ob_flush();//修改部分 flush(); sleep(1); } ?>
運行一下,是不是發現$i也隔一秒輸出一次了?這是為什么呢?
別急,我們來看看php.ini.PHP實戰
打開php.ini,搜索output_buffering,我們會看到類似這樣的設置 output_buffering = 4096.正如它的名字output_buffering一樣,這個設置的作用就是把輸出緩沖一下,緩沖大小為4096bytes.PHP實戰
在我們的第一段代碼里,之所以沒有按預期的輸出,正是因為這個output_buffering把那些輸出都緩沖了.沒達到4096bytes或者腳本結束,輸出是不會被發送出去的.PHP實戰
而第二段代碼中的ob_end_clean()和ob_end_flush()的作用,就是終止緩沖.這樣就不用等到有4096bytes的緩沖之后才被發送出去了.PHP實戰
第三段代碼中,用了一句ob_flush(),它的作用就是把緩沖的數據發送出去,但是并不會終止緩沖,所以它必須在每次flush()前使用.PHP實戰
如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我們就必須把php.ini里的output_buffering設得足夠小,例如設為0.需要注意的是,如果你打算在腳本中使用ini_set("output_buffering","0″)來設置,那么請停下來吧,這種辦法是不行的.因為在腳本一開始的時候,緩沖設置就已經被載入,然后緩沖就開始了.PHP實戰
可能你會問了,既然ob_flush()是把緩沖的數據發送出去,那么為什么還需要用flush()???直接用下面這段代碼不行嗎??PHP實戰
<?php for ($i=10; $i>0; $i--) { echo $i; ob_flush(); sleep(1); } ?>
請注意ob_flush()和flush()的區別.前者是把數據從PHP的緩沖中釋放出來,后者是把不在緩沖中的或者說是被釋放出來的數據發送到瀏覽器.所以當緩沖存在的時候,我們必須ob_flush()和flush()同時使用.PHP實戰
那是不是flush()在這里就是不可缺少的呢?不是的,我們還有另外一種辦法,使得當有數據輸出的時候,馬上被發送到瀏覽器.下面這兩段代碼就是不需要使用flush()了.(當你把output_buffering設為0的時候,連ob_flush()和ob_end_clean()都不需要了)PHP實戰
<?php ob_implicit_flush(true); for ($i=10; $i>0; $i--) { echo $i; ob_flush(); #如果ob函數打開的情況下 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()來發送到瀏覽器了.PHP實戰
以上所訴可能在某些瀏覽器中不成立.因為瀏覽器也有自己的規則.我是用Firefox1.5,IE6,opera8.5來測試的.其中opera就不能正常輸出,因為它有一個規則,就是不遇到一個HTML標簽,就絕對不輸出,除非到腳本結束.而FireFox和IE還算比較正常的.PHP實戰
最后附上一段非常有趣的代碼,作者為PuTTYshell.在一個腳本周期里,每次輸出,都會把前一次的輸出覆蓋掉.
以下代碼只在firefox下可用,其他瀏覽器并不支持multipart/x-mixed-replace的Content-Type.PHP實戰
<?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基本語法入門教程》、《PHP錯誤與異常處理辦法總結》及《php常用函數與技巧總結》PHP實戰
希望本文所述對大家PHP程序設計有所贊助.PHP實戰
歡迎參與《PHP實例:PHP緩沖區用法總結》討論,分享您的想法,維易PHP學院為您提供專業教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7558.html