開始以前先看下php自帶緩存指令:php
ob_start() //開啓緩存 php.ini中通常是4096nginx
ob_clean() //清空緩存程序員
ob_end_clean() //清空緩存,關閉緩存web
ob_flush() //刷新緩存(將緩存現有內容輸出) 把php緩存寫入apahce/nginx緩存apache
flush() //把apahce/nginx緩存寫入瀏覽器緩存瀏覽器
ob_end_flush() //刷新緩存,並關閉緩存緩存
$contents = ob_get_contents() //得到緩存內容架構
全部的php程序員都知道在php腳本里面執行 echo 「1」;訪客的瀏覽器裏面就會顯示「1」。函數
可是咱們執行下面的代碼的時候,並非顯示「1」以後1秒再顯示「2」,而是等待5秒後直接顯示「12」學習
echo '1'; sleep(1); echo '2';
這就涉及到幾個緩存機制,爲了更高的薪水,同窗們很是有必要把這個緩存機制學習好。
一般狀況下,咱們的web應用由如下幾個要素構成:
php->apache->瀏覽器。這篇文章咱們就以這個架構爲例來說解數據是如何在整個「鏈條」上流通的。
看了上面的圖,咱們終於知道上面爲何會同時顯示「12」了,由於echo '1'尚未裝滿php的緩存,因此「1」還在php的緩存裏面,沒有到瀏覽器,等到程序結束後「12」才一塊兒到瀏覽器。
固然咱們也能夠手動刷新緩存
echo '1'; ob_flush(); //把php緩存寫入apahce緩存 flush(); //把apahce緩存寫入瀏覽器緩存 sleep(1); echo '2';
咱們把代碼改爲如上以後,瀏覽器仍是要等1秒才同時顯示「12」,這是由於「1」雖然已經發送給瀏覽器,可是瀏覽器緩存尚未裝滿,並無渲染,一直到等到程序結束後才渲染出「12」。
咱們以谷歌瀏覽器爲例(緩存1000bytes),經過下面的代碼,咱們就能夠實現先顯示「1」,隔1秒再顯示「2」
for($i=1;$i<11;$i++){ echo str_repeat(' ' ,1000); //這裏會把瀏覽器緩存裝滿 ob_flush(); //把php緩存寫入apahce緩存 flush(); //把apahce緩存寫入瀏覽器緩存 sleep(1); echo $i; }
講到這裏,咱們不得不提一下「ob_start()」這個函數,這個函數的做用就是開啓一個新的php緩存。咱們仍是經過代碼來講明
ob_start(); for($i=1;$i<11;$i++){ echo str_repeat(' ' ,1000); //這裏會把瀏覽器緩存裝滿 ob_flush(); //把php緩存寫入apahce緩存 flush(); //把apahce緩存寫入瀏覽器緩存 sleep(1); echo $i; }
在原有的基礎上咱們僅僅加了個ob_start(),結果又變成了等1秒後同時顯示"1234"了,(須要將1000改成4096纔會1秒顯示I個)。這是由於每個ob_start()都在原來的緩存空間上開闢一個子緩存空間,ob_flush()是把當前緩存空間輸出到上級緩存空間,php只有一個緩存空間的時候,上級緩存空間就是apache的緩存,當php有多個緩存空間的時候,ob_flush()的就不能把php緩存寫入apache緩存了