從php到瀏覽器的快取機制,不得不看!

2022-04-16 09:16:06 字數 1621 閱讀 8407

所有的php程式設計師都知道在php指令碼裡面執行 echo 「1」;訪客的瀏覽器裡面就會顯示「1」。

但是我們執行下面的**的時候,並不是顯示「1」之後5秒再顯示「2」,而是等待5秒後直接顯示「12」

echo '1';

sleep(5);

echo '2';

這就涉及到幾個快取機制,為了更高的薪水,同學們非常有必要把這個快取機制學習好。

通常情況下,我們的web應用由以下幾個要素構成:

php->apache->瀏覽器。這篇文章我們就以這個架構為例來講解資料是如何在整個「鏈條」上流通的。

看了上面的圖,我們終於知道上面為什麼會同時顯示「12」了,因為echo '1'還沒有裝滿php的快取,所以「1」還在php的快取裡面,沒有到瀏覽器,等到程式結束後「12」才一起到瀏覽器。

當然我們也可以手動重新整理快取

echo '1';

ob_flush(); //

把php快取寫入apahce快取

flush(); //

把apahce快取寫入瀏覽器快取

sleep(5);

echo '2';

我們把**改成如上之後,瀏覽器還是要等5秒才同時顯示「12」,這是因為「1」雖然已經傳送給瀏覽器,但是瀏覽器快取還沒有裝滿,並沒有渲染,一直到等到程式結束後才渲染出「12」。

我們以谷歌瀏覽器為例(快取1000bytes),通過下面的**,我們就可以實現先顯示「1」,隔5秒再顯示「2」

echo

str_repeat(' ' ,1000); //

這裡會把瀏覽器快取裝滿

echo '1';

ob_flush(); //

把php快取寫入apahce快取

flush(); //

把apahce快取寫入瀏覽器快取

sleep(5);

echo '2';

講到這裡,我們不得不提一下「ob_start()」這個函式,這個函式的作用就是開啟乙個新的php快取,但是這個快取遠遠不止4096,php文件中描述的是這個快取足夠大。我們還是通過**來說明

ob_start();

echo

str_repeat(' ' ,1000); //

這裡會把瀏覽器快取裝滿

echo '1';

ob_flush();

flush(); //

把apahce快取寫入瀏覽器快取

sleep(5);

echo '2';

在原有的基礎上我們僅僅加了個ob_start(),結果又變成了等5秒後同時顯示"12"了。這是因為每乙個ob_start()都在原來的快取空間上開闢乙個子快取空間,ob_flush()是把當前快取空間輸出到上級快取空間,php只有乙個快取空間的時候,上級快取空間就是apache的快取,當php有多個快取空間的時候,ob_flush()的就不能把php快取寫入apache快取了。我們還是借助來理解:

從php到瀏覽器的快取機制

所有的php程式設計師都知道在php指令碼裡面執行 echo 1 訪客的瀏覽器裡面就會顯示 1 但是我們執行下面的 的時候,並不是顯示 1 之後5秒再顯示 2 而是等待5秒後直接顯示 12 這就涉及到幾個快取機制,為了更高的薪水,同學們非常有必要把這個快取機制學習好。通常情況下,我們的web應用由以...

瀏覽器快取機制

最近在準備優化日誌請求時遇到了一些令人疑惑的問題,比如為什麼響應頭里出現了兩個 cache control 為什麼明明設定了 no cache 卻還是發請求,為什麼多次訪問時有時請求裡帶了 etag,有時又沒有帶?等等。後來查了一些資料以及同事親自驗證,總算對這些問題有了個清晰的理解,現在整理出來以...

瀏覽器快取機制

當我們瀏覽乙個頁面發現有異常時,通常考慮的就是書不是瀏覽器做了快取呢,按ctrl f5重新請求一次就能請求到沒有快取的頁面,這個是為什麼呢。首先,ctrl f5組合鍵重新整理頁面,那麼瀏覽器會直接向目標url傳送請求,而不再使用瀏覽器快取的資料。其次,當請求到達伺服器端依然有可能出現使用伺服器端的資...