php緩存機制

開始以前先看下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緩存了

相關文章
相關標籤/搜索