剖析PHP中的輸出緩衝 flush之類

2022-03-19 13:32:37 字數 2369 閱讀 1343

<?php

for ($i=10; $i>0; $i--)

?>

按照php手冊裡的說法

該函式將當前為止程式的所有輸出傳送到使用者的瀏覽器。

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

好,我們來改一下這段**,改成

<?php

ob_end_clean();//修改部分

for ($i=10; $i>0; $i--)

?>

嘿,加了這一句ob_end_clean();,居然就ok了。實際上,我們把ob_end_clean()換成ob_end_flush()也一樣ok。

我再來改一改。

<?php

for ($i=10; $i>0; $i--)

?>

執行一下,是不是發現$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--)

?>

請注意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--)

?>

<?php

ob_end_clean();

ob_implicit_flush(true);

for ($i=10; $i>0; $i--)

?>

請注意看上面的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 ++ )

print "content-type: text/plain\n\n";

print "the end\n";

print "--endofsection--\n";

?>

PHP中輸出緩衝

在php中,當執行echo,print的時候,輸出並沒有馬上通過tcp傳給client瀏覽器顯示,而是將資料寫入php buffer。php output buffering機制,意味在tcp buffer之前,建立了一新的佇列,資料必須經過該佇列。當乙個php buffer寫滿的時候,指令碼程序會...

PHP中重新整理輸出緩衝

buffer是乙個記憶體位址空間,linux系統預設大小一般為4096 1kb 即乙個記憶體頁。主要用於儲存速度不同步的裝置或者優先順序不同的 裝置之間傳辦理資料的區域。通過buffer,可以使程序這間的相互等待變少。這裡說乙個通俗一點的例子,你開啟文字編輯器編輯乙個檔案的時候,你每輸入 乙個字元,...

PHP中重新整理輸出緩衝

php中重新整理輸出緩衝 buffer是乙個記憶體位址空間,linux系統預設大小一般為4096 1kb 即乙個記憶體頁。主要用於儲存速度不同步的裝置或者優先順序不同的 裝置之間傳辦理資料的區域。通過buffer,可以使程序這間的相互等待變少。這裡說乙個通俗一點的例子,你開啟文字編輯器編輯乙個檔案的...