PHP輸出快取 output buffering

2021-06-18 19:05:15 字數 2252 閱讀 8280

首先明確一下php的輸出順序

1.開啟了php輸出快取: echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display

2.未開啟php輸出快取: echo,print -> server buffering -> browser buffering -> browser display

另外明確一下瀏覽器的輸出快取:ie為256bytes, chrome與firefox為1000bytes,只有輸出資料達到了這個長度或者指令碼結束瀏覽器才會將資料輸出在頁面上

再來說說用到的幾個php設定和api:

1.php.ini中的output_buffering配置

2.php.ini中的implicit_flush配置

3.ob_flush()函式: 取出php buffering中的資料,放入server buffering

4.flush()函式: 取出server buffering的資料,放入browser buffering

5.ob_start()函式:對於這個函式我現在了解的不是很清楚,因為開啟後輸出就會不受ob_flush()控制,即使使用ob_flush()和flush(),資料也不能立即輸出在瀏覽器上.現在知道的是,如果output_buffering=off,即使使用了ob_start(),也是無法將輸出資料快取的,而如果output_buffering=on的話,即使不用ob_start(),輸出資料也可以被php快取,所以覺得ob_start比較廢,暫時不管他

然後我們來看**吧(設定output_buffering=4096,implicit_flush=off)

123

<?php4 //

ob_start();

//這玩意開了就會不正常,輸出不受ob_flush()控制,不知道到底幹嘛用5//

echo str_repeat(' ' ,1000);

//ie快取256bytes

6 echo str_repeat('

' ,1000); //

chrome和ff快取1000bytes,這裡用來先將瀏覽器快取用掉,但是很疑惑這一行輸出為什麼沒有被output_buffering存起來,而是直接輸出了

7for($i=0;$i<5;$i++)

13 ?>

1415

這裡**輸出結果是一行一行輸出的,具體原理大家參考一下ob_flush()和flush()函式的功效

這兩個函式缺了任何乙個在我這種設定下都是要等到 0, 1, 2, 3, 4都快取起來後最後一起輸出

最後引用一段laruence的一段blog,希望對大家的理解有幫助

ob_flush/flush在手冊中的描述, 都是重新整理輸出緩衝區, 並且還需要配套使用, 所以會導致很多人迷惑…

其實, 他們倆的操作物件不同, 有些情況下, flush根本不做什麼事情..

ob_*系列函式, 是操作php本身的輸出緩衝區.

所以, ob_flush是重新整理php自身的緩衝區.

而flush, 嚴格來講, 這個只有在php做為apache的module(handler或者filter)安裝的時候, 才有實際作用. 它是重新整理webserver(可以認為特指apache)的緩衝區.

在apache module的sapi下, flush會通過呼叫sapi_module的flush成員函式指標, 間接的呼叫apache的api: ap_rflush重新整理apache的輸出緩衝區, 當然手冊中也說了, 有一些apache的其他模組, 可能會改變這個動作的結果..

有些apache的模組,比如mod_gzip,可能自己進行輸出快取,

這將導致flush()函式產生的結果不會立即被傳送到客戶端瀏覽器。

甚至瀏覽器也會在顯示之前,快取接收到的內容。例如 netscape

瀏覽器會在接受到換行或 html 標記的開頭之前快取內容,並且在

接受到 標記之前,不會顯示出整個**。

一些版本的 microsoft internet explorer 只有當接受到的256個

位元組以後才開始顯示該頁面,所以必須傳送一些額外的空格來讓這

些瀏覽器顯示頁面內容。

所以, 正確使用倆者的順序是. 先ob_flush, 然後flush,

當然, 在其他sapi下, 不呼叫flush也可以, 只不過為了保證你**的可移植性, 建議配套使用.

關於php關閉輸出快取,實現即時輸出

php輸出預設所有的輸出放到最後一起輸出,如果要實現即時輸出則需要關閉輸出快取,在apache下用到的方法是 ob end flush 關閉快取 ob implicit flush true 每次快取即時輸出相當於每次輸出後呼叫flush 需要注意的是每次輸出如果用ajax呼叫需要加乙個休眠時間,經...

php即時 重新整理快取 輸出內容

通常的情況下用php輸出內容會先快取,到最後全部輸出.如果有乙個多步的耗時操作,所有的結果都要等到頁面執行完後才能看到.中間漫長的過程只有等待.能不能立即都看到每步的結果呢 ob flush 是重新整理php自身的緩衝區。flush 只有在php做為apache的module handler或者fi...

頁面輸出快取

頁面輸出快取 最簡單的一種,下面的duration和varybyparam屬性是必須的 outputcache duration 10 varybyparam none 只使用.cs檔案來設定頁面輸出快取 通過web.config設定頁面輸出快取 中的配置 頁面檔案 outputcache cach...