今天發現線上有個問題,線上一個圖片域名,在前端已經加了CDN緩存,不落緩存,則用PHP動態實現圖片縮放,但經PHP處理過的圖片輸出后,每次都要從后端讀取,后端服務器壓力瞬間增加,經分析,PHP中沒有作304的處理,
HTTP的原理是這樣的,每次請求到服務器后,服務端檢測有沒有修改,如沒有修改,可以直接返回一個304的狀態碼,這樣就用客戶端的緩存了,CDN的原理就是如此,如果設置了304,就會將相應的URL進行緩存起來;
相關代碼如下:
header("Last-Modified: " . gmdate("D, d M Y H:i:s", strtotime('2011-1-1'))." GMT");
//輸出etag頭
header('etag:' . md5($this->image));
header('Cache-Control:max-age=2592000');echo $this->image;
其中http頭HTTP_IF_NONE_MATCH,一般是服務器返回的對某一URL的標識,一般用MD5計算,這樣我們檢測MD5值對不對,相同就可以返回304了;
PS:
剛開始抓了半天包,只看到服務端返回的Etag標簽,沒看到客戶端的http頭中If-None-Match,害得在fastcgi.conf.default 中加入如下代碼:
新聞熱點
疑難解答