關於flush()和ob_flush()

php中sleep函數的用法,可以讓程序沒有結束就輸出內容,類似於進度條

張存超php技術博客

flush
(PHP 3, PHP 4, PHP 5)

flush — 刷新輸出緩衝
說明
void flush ( void )


刷新PHP程序的緩衝,而不論PHP執行在何種情況下(CGI ,web服務器等等)。該函數將當前爲止程序的所有輸出發送到用戶的瀏覽器。

flush() 函數不會對服務器或客戶端瀏覽器的緩存模式產生影響。因此,必須同時使用 ob_flush() 和flush() 函數來刷新輸出緩衝。

個別web服務器程序,特別是Win32下的web服務器程序,在發送結果到瀏覽器之前,仍然會緩存腳本的輸出,直到程序結束爲止。

有些Apache的模塊,比如mod_gzip,可能自己進行輸出緩存,這將導致flush()函數產生的結果不會立即被髮送到客戶端瀏覽器。

甚至瀏覽器也會在顯示之前,緩存接收到的內容。例如 Netscape 瀏覽器會在接受到換行或 html 標記的開頭之前緩存內容,並且在接受到 </table> 標記之前,不會顯示出整個表格。

一些版本的 Microsoft Internet Explorer 只有當接受到的256個字節以後纔開始顯示該頁面,所以必須發送一些額外的空格來讓這些瀏覽器顯示頁面內容。
ob_flush
(PHP 4 >= 4.2.0, PHP 5)

ob_flush — Flush (send) the output buffer
Description
void ob_flush ( void )
This function will send the contents of the output buffer (if any). If you want to further process the buffer’s contents you have to call ob_get_contents() before ob_flush() as the buffer contents are discarded after ob_flush() is called.

This function does not destroy the output buffer like ob_end_flush() does.
flush和ob_flush的使用上有一些特別容易犯錯的地方,造成無法刷新輸出緩衝。
一. flush和ob_flush的正確順序,正確應是,先ob_flush再flush,如下:
ob_flush();
flush();
如果Web服務器的操作系統是windows系統,那順序顛倒或者不使用ob_flush()也不會出現問題。但是在Linux系統上就無法刷新輸出緩衝。

二. 使用ob_flush()前,確保前面的內容大小足夠4069字符。
一些Web服務器的output_buffering默認是4069字符或者更大,即輸出內容必須達到4069字符服務器纔會flush刷新輸出緩衝,爲了確保flush有效,最好在ob_flush()函數前有以下語句:
print str_repeat(” “, 4096);
以確保到達output_buffering值。

for ($i=10; $i>0; $i–)
{
echo $i.’<br />’;
ob_flush();
flush();
sleep(1);
}
ob_end_flush();


發佈了29 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章