看到標題我相信有很多人一臉懵不知道output_buffering是什麼,我也相信有很多人都知道output_buffering是乾什麼的,那麼我們今天就帶大家介紹下php中關於output_buffering的詳細介紹、知道的可以鞏固下知識點,不知道的可以好好學習一下!
一、我們要說一下php中的快取大概有哪些!
在PHP中,我們可以粗略的將快取分為客戶端快取(Browser快取),伺服器端快取(Server快取)。由於PHP是基於B/S架構的,所以,我們可以理解為瀏覽器端的緩存,伺服器端快取。
在伺服器端PHP自帶的快取中,主要可以分成兩大類快取!程式緩存和OB緩存!這也是我們學習伺服器端快取的主要內容!
在PHP中快取的輸出順序為:
開啟了php輸出快取:
echo,print -> php output_buffering -> server buffering -> browser buffering -> browser display
未開啟php輸出快取:
echo,print -> server buffering -> browser buffering -> browser display
瀏覽器的輸出快取: IE為256Bytes, Chrome與FireFox為1000Bytes,只有輸出資料達到了這個長度或腳本結束瀏覽器才會將資料輸出在頁面上。
二、伺服器端的回應流程
A、客戶端傳送請求回應伺服器端!
B、Apache伺服器載入了PHP模組,開啟對應的進程(或執行緒)運行對應的PHP腳本頁面!
C、在沒有開啟OB快取的情況下,執行的結果全部都會被放到程式快取中,然後打包發送給瀏覽器!瀏覽器對頁面進行渲染,產生我們最後看到的WEB頁面!
D、在開啟了OB快取的情況下,運行的結果會被分別放入到OB快取和程式快取中,當程式運行到最後一行的時候,就會將OB快取中的資料刷回到程式快取中,然後打包回傳給瀏覽器!瀏覽器對頁面進行渲染,產生我們看到的WEB頁面!
三、OB快取的常見用法!
a、output_buffering=4096,輸出較少的資料(少於一個buffer)
for($i=0; $i<5; $i++){ echo $i.'<br>'; sleep(1); }
運行結果:等所有腳本全部運行完成後,才輸出,因為資料未滿一個buffer的大小。
b、output_buffering=4096,輸出較少的資料(少於一個buffer),關閉output_buffering,修改php.ini的output_buffering=0
echo str_repeat(" ",1024);//这里重复输出一个空白 for($i=0; $i<5; $i++){ echo $i."<br/>"; flush(); sleep(1); }
運行結果:因為禁用了OB,不需要等到腳本運作完畢就可以輸出,資料沒有在OB停留,可以看到斷斷續續間歇性輸出。 echo ->browser buffering -> browser display
c、output_buffering=4096,輸出較大資料(大於一個buffer),不使用ob_start()
for($i=0; $i<5; $i++){ echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>'; sleep(2); }
運行結果:f. txt為一個大於4kb的文件,因為大於buffer預設值,buffer空間不夠用,每當滿一個buffer就會輸出,所以可以看到間歇性輸出。
d、output_buffering=4096,輸出較大資料(大於一個buffer),使用ob_start()
ob_start(); for($i=0; $i<5; $i++){ echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>'; sleep(2); }
運行結果:因為使用了ob_start(),會為buffer設定夠大的空間,因此會儲存到腳本執行完畢後才會輸出。
e、output_buffering=On,使用ob_start()
ob_start(); echo "abc-"; header("content-type:text/html;charset=utf-8"); echo "hello-"; ob_end_flush(); echo "aa-"; echo ob_get_contents();
運行結果:abc-hello-aa-abc-hello-aa-
f、output_buffering=Off,使用ob_start()
ob_start(); echo "abc-"; header("content-type:text/html;charset=utf-8"); echo "hello-"; ob_end_flush(); echo "aa-"; echo ob_get_contents();
運行結果:
abc-hello-aa-
輸出緩衝區是可堆疊的,這即意謂著,當有一個ob_start() 是活躍的時, 你可以調用另一個ob_start() 。 只要確保又正確呼叫了 ob_end_flush() 恰當的次數即可。 如果有多重輸出回呼函數是活躍的,輸出內容會一直按嵌套的順序依序通過它們而被過濾。
注意:PHP5.2中,OB預設是關閉的,5.3之後預設是開啟的;
常用方法:
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中的資料。
4.ob_flush 、flush、ob_implicit_flush
ob_flush 會刷新php buffering 中的資料到程式快取
flush 則會刷新程式快取到瀏覽器快取中
ob_implicit_flush 將會開啟或關閉絕對(隱式)刷送。絕對(隱式)刷送將導致在每次輸出呼叫後有一次刷送操作,以便不再需要對 flush() 的明確呼叫
四、OB快取的作用!
OB快取在各方面都有應用,但是,本人知道的主要是在兩個方面!
a、當網站準備做網站靜態化的時候,選擇OB快取是不錯的選擇!
b、解決Warning: Cannot modify header information - headers already sent by的錯誤!
究其發生錯誤的原因:是因為回應頭和對應主體位置錯置所導致的!正常情況下,伺服器傳回瀏覽器的相應內容,應該是:回應頭+回應主體!
但是,如果我們開啟了OB緩存,那麼對應頭資訊(一般也就是header()函數進行設定的資訊),就會被放入到程式快取中!
而其他的輸出內容,如:echo print_r var_dump 等,都會先被放入OB快取中!
等程式結束的時候,或是OB快取關閉的實話,將OB快取的內容在放入程式快取中!從而保證回應頭訊息,始終在回應主體內容之前!
總結:
相信透過對本文的學習不知道output_buffering的小夥伴有了認識和了解,知道的小夥伴可以鞏固下自己的知識點,希望對你的工作有幫助!
相關推薦:
#基於php輸出快取output_buffering實例詳解
#基於PHP輸出快取(output_buffering)的深入理解
######################################以上是php中關於output_buffering的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!