使用HTTP緩存狀態碼200和304提升網站訪問速度
網站訪問速度對一個網站來說是非常重要的,訪問慢會流失用戶,訪問快會大大的提高用戶體驗。提升網站訪問速度的方式很多,比如這裡提升PHP程序運行速度的幾個優化方案,但火端今天要介紹的是HTTP緩存,也可以叫瀏覽器緩存。
瀏覽器緩存大概有兩種,和各有各的優勢,把他們發揮好可以大大的提升訪問速度。
1、200 OK (from memory/disk cache)
這種緩存方式已經很普遍,大部分網站的靜態文件都採用了,200 OK (from memory cache)或者200 OK (from disk cache)都是直接讀取客戶端的緩存,無需再請求伺服器。一般是在Apache或者Nginx里設置,比如Nginx配置里會有類似這樣的配置:
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*.(js|css)?$
{
expires 12h;
}
這樣就可以給靜態文件緩存了,在有效期內,瀏覽器會直接讀取客戶端的緩存,而不用再請求伺服器,除非用戶清除了緩存或者使用Ctrl+F5強制刷新了頁面。
比如上圖,是已經緩存過了的,至於有些是200 OK (from memory cache)有些會是200 OK (from disk cache)都差不多,只是從客戶端取的位置不一樣而已。除了給靜態文件做200 OK (from cache)緩存外,其實我們也可以給某些頁面做,比如一些不經常改變內容的ajax頁面。
舉個例子:
一個在線手冊網站,左側是導航,用戶瀏覽手冊時可能會頻繁在不同的文檔頁面來回切換,如果不啟用HTTP緩存,體驗會非常差,如果使用Ajax切換,再加上200 OK (from cache)就可以做到快速切換了,無刷新、無白屏,體驗棒棒噠!
200緩存能大大的提升速度,但是如果網站內容有更新,訪客是無法及時的獲取最新的內容。這時候我們一般是採用在靜態文件後面加參數來解決,比如 /statis/js/jquery.js?20180505 ,因為是一個新的URL,所以瀏覽器沒有緩存可取,只能取新內容。
2、304 Not Modified
304緩存和上面最大的區別是瀏覽器需要向伺服器詢問一次,如果伺服器端認為沒有內容更新,直接返回304狀態碼,無需返回body內容,瀏覽器就會直接取緩存內容輸出,這樣省掉了沒必要的數據傳輸,也就提升了訪問速度。
要實現304緩存,我們需要在瀏覽器首次訪問時返回過期時間等header,比如如下PHP代碼:
$time=86400; //單位秒
header("Cache-Control:max-age=" . $time);
header("Expires: " . gmdate("D, d M Y H:i:s", time() + $time) . " GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
上面的代碼就告訴了瀏覽器緩存時間,下次瀏覽器再訪問該頁面的時候會帶上名叫的請求頭來訪問,這時候我們可以用PHP變數:來獲取瀏覽器記錄的緩存時間,如果沒有內容更新,我們直接返回304狀態碼即可,如果有更新直接輸出新內容,並返回新的過期時間給瀏覽器。大概的代碼如下:
$time = 86400;
if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])){
$is_update=0;//判斷是否有更新
if($c_time > time()){
header("Cache-Control:max-age=".$time);
header("Expires: " . gmdate("D, d M Y H:i:s",time()+$time)." GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("HTTP/1.1 304 Not Modified");
exit();
}
}
header("Cache-Control:max-age=" . $time);
header("Expires: " . gmdate("D, d M Y H:i:s", time() + $time) . " GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
具體使用還需要考慮一些其它問題,本站就已經在很多頁面使用了304緩存功能,返回狀態如下圖:
如何來判斷伺服器內容是否有更新有很多種方式,比如Etag功能就可以,關於Etag的介紹可以百度下。網站訪問速度很重要,能快一點,就讓它快一點吧!搞網站就在於折騰,哈!
TAG:火端網路 |