對於PHP輸出的內容,如果不是需要經常變動的內容(例如偽靜態的一些頁面,PHP輸出JS或者CSS),使用PHP合理設置HTTP響應頭添加緩存設置,讓瀏覽器盡可能緩存下內容,在刷新和再次訪問同樣內容時,便不需要再次請求瀏覽器,從而能夠大幅減少服務器的響應次數,同時瀏覽器呈現頁面也會加快了,這是非常有用的一個技巧。
1、輸出Cache-Control頭:
這個的輸出是表明讓瀏覽器緩存120秒。這個指令很有用,但是局限性在於,刷新這個頁面時還是會重新請求,所以你會感覺這個頭好像沒什么作用,但是對於一些輸出的JS、CSS內容時是有用的,也就是說你刷新的頁面不是它本身,而只是引用了設置有此頭的PHP文件的話,它就會在你指定的時間內從本地緩存中讀取內容而不會請求服務器。同時通過超鏈接過來的已經請求過的頁面時,你也會看到瀏覽器從本地cache里讀取而不用通過服務器。
2、更高級玩法:通過設置Last-Modified、Expires頭設定緩存
如下面這段代碼
<?php
$interval=120; //2分鍾
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])){
// HTTP_IF_MODIFIED_SINCE即下面的: Last-Modified,文檔緩存時間.
// 緩存時間+時長.
$c_time = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])+$interval;
// 當大於當前時間時, 表示還在緩存中... 釋放304
if($c_time > time()){
header('HTTP/1.1 304 Not Modified');
exit();
}
}
header('Cache-Control:max-age='.$interval);
header("Expires: " . gmdate("D, d M Y H:i:s",time()+$interval)." GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
echo ' - <a href="">點擊重新載入本頁面</a><br />';
當瀏覽器首次訪問時,請求頭不會帶HTTP_IF_MODIFIED_SINCE這個東西,所以我們就設置了三個頭。
一個就是剛才第1點,Cache-Control頭,告訴讓瀏覽器自己緩存個120秒。
第二個頭Expires是表明,在當前時間的120秒后緩存失效,瀏覽器會在120秒后把緩存失效,再次請求時會到服務器端請求而不是本地。
第三個頭Last-Modified則是說明這個文檔最后修改時間。可以看出輸出的當前時間。
當瀏覽器再次訪問時(刷新頁面),瀏覽器因為在第一次時接收到了Last-Modified,它便會根據這個時間去檢查服務器的文檔是否更新過,也就是會把這個時間用HTTP_IF_MODIFIED_SINCE這個東西帶過去,於是也就有了第一個花括號內容的判斷。而花括號內再次根據這個時間加上你設置的時間(120秒),看看是不是超出了當前的時間time(),如果超出了,那就是還在緩存期內,幫直接返回304,然后直接退出。這時候瀏覽器便會自動用緩存的內容。這樣子做,服務器返回的內容就很短,只是一個304響應頭而已,而內容不需要返回,這可大大節省網絡流量,顯然瀏覽器的響應速度也會感覺明顯快了。
按F5刷新或者按瀏覽器的刷新按鈕時,你將發現2分鍾內你的PHP請求將是304狀態返回。
強制刷新(CTRL+F5)時,瀏覽器不會帶HTTP_IF_MODIFIED_SINCE這個東西去判斷,所以同正常瀏覽一樣,返回200狀態。這個邏輯是正常的,因為強制刷新本就相當於完全請求一遍最新內容。
瀏覽器頭中的緩存設置雖然技巧雖小,但是在web應用中非常有用。合理利用瀏覽器的緩存,盡量避免重復內容的請求,一個頁面少了幾十KB的請求,流量大的網站一天能夠節省幾百M甚至幾G的網絡流量。這對提升用戶體驗來說也是一個相當重要的設置項。