php output buffering 快取使用

2022-08-10 23:42:23 字數 2850 閱讀 1916

buffer是乙個記憶體位址空間,linux系統預設大小一般為4096(4kb)。主要用於儲存速度不同步的裝置或優先順序不同的裝置之間傳遞資料的區域。

通過buffer可以使程序之間的相互等待變少。

例如,當你開啟乙個文字編輯器,輸入乙個字元時,系統並不會立即寫入磁碟。而是儲存在buffer中,當寫滿乙個buffer時,才會把buffer的內容寫入磁碟。

當然也可以使用flush強制將buffer的資料寫入磁碟。

在php中,例如 echo,print,輸出並不會立即通過tcp傳遞給瀏覽器輸出。而是將資料寫入php buffer。當乙個php buffer寫滿,才會通過tcp傳遞給瀏覽器。

echo /print -> php output_buffer -> tcp buffer -> browser

php output_buffering

預設情況下,php buffer是開啟的,預設值是4096(4kb)。可以在php.ini中找到output_buffering 配置。知道buffer寫滿,才會傳送到瀏覽器。

也可以設定ob_start(),這樣即使超過預設值(4kb)也不會立即傳送到瀏覽器,只到指令碼執行完成,或者呼叫了ob_end_flush方法,才會輸出到瀏覽器。

1.output_buffering=4096,輸出較少的資料(少於乙個buffer)

<?php

for($i=0; $i<10; $i++)

?>

執行結果:等所有指令碼全部執行完成後,才輸出,因為資料未滿乙個buffer的大小。

2.output_buffering=4096,輸出較少的資料(少於乙個buffer),關閉output_buffering,修改php.ini的output_buffering=0

<?php

for($i=0; $i<10; $i++)

?>

執行結果:因為禁用了php buffering,不需要等到指令碼執行完畢就可以輸出,資料沒有在php buffer停留,可以看到斷斷續續間歇性輸出。echo -> tcp buffer ->browser

3.當output_buffering=4096,輸出較大資料(大於乙個buffer),不使用ob_start()

<?php

for($i=0; $i<10; $i++)

?>

執行結果:f.txt為乙個大於4kb的檔案,因為大於buffer預設值,buffer空間不夠用,每當滿乙個buffer就會輸出,所以可以看到間歇性輸出。

4.當output_buffering=4096,輸出較大資料(大於乙個buffer),使用ob_start()

<?php

ob_start();

for($i=0; $i<10; $i++)

?>

執行結果:因為使用了ob_start(),會為buffer設定足夠大的空間,因此會儲存到指令碼執行完畢後才會輸出。

output_buffering 方法

1.ob_start

啟用output_buffering機制,一旦啟用,指令碼不再直接輸出到瀏覽器,而是暫時寫入php buffering區域。直到指令碼執行完畢後,才傳送。

2.ob_get_contents

獲取php buffering中的資料,注意:要在ob_end_clean()前呼叫,否則只會得到空字元。

3.ob_end_flush 和 ob_end_clean

ob_end_flush 會輸出php buffering 中的資料,但不會清空。

ob_end_clean 不會輸出,只會清空php buffering中的資料。 

注意:

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也可以, 只不過為了保證你**的可移植性, 建議配套使用。

springboot中Cache快取的使用

org.springframework.boot spring boot starter cache enablecaching public static void main string args cacheable 根據方法請求引數對其結果進行快取 查詢 自定義配置類配置keygenerato...

快取頭 Cache Control 的含義和使用

本篇我們來寫一下http 中的快取,即cache control cache control 的可快取性 指明哪些地方可以快取返回的資料 public http 返回的時候在heaher 中設定cache control 的值為 public 它代表,這個http 請求它返回的內容所經過的任何路徑中...

快取頭Cache Control 的含義和使用

1 public 表示任何地方 都可以進行快取 2 private 表示 只允許 發起 請求 的瀏覽器 才可以 進行 快取 3 no cache 任何 地方 都不允許 快取 可以進行快取,但是每次都需要向伺服器請求驗證 快取是否可用 4 max age 單位s 秒 表示 快取 過多久 時間 到期 5...