PHP文件生成的圖片無法使用CDN緩存的解決方法
今天發(fā)現(xiàn)線上有個問題,線上一個圖片域名,在前端已經(jīng)加了CDN緩存,不落緩存,則用PHP動態(tài)實現(xiàn)圖片縮放,但經(jīng)PHP處理過的圖片輸出后,每次都要從后端讀取,后端服務(wù)器壓力瞬間增加,經(jīng)分析,PHP中沒有作304的處理,
HTTP的原理是這樣的,每次請求到服務(wù)器后,服務(wù)端檢測有沒有修改,如沒有修改,可以直接返回一個304的狀態(tài)碼,這樣就用客戶端的緩存了,CDN的原理就是如此,如果設(shè)置了304,就會將相應(yīng)的URL進(jìn)行緩存起來;
相關(guān)代碼如下:
//檢測有沒改變
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])){
$etag = $_SERVER['HTTP_IF_NONE_MATCH'];
if (md5($this->image) === $etag){
header("HTTP/1.1 304 Not Modified");
exit;
}
}
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,一般是服務(wù)器返回的對某一URL的標(biāo)識,一般用MD5計算,這樣我們檢測MD5值對不對,相同就可以返回304了;
PS:
剛開始抓了半天包,只看到服務(wù)端返回的Etag標(biāo)簽,沒看到客戶端的http頭中If-None-Match,害得在fastcgi.conf.default 中加入如下代碼:
fastcgi_param CACHE_ETAG $http_if_none_match;
一打印$_SERVER,根本就沒有CACHE_ETAG這個變量,看來nginx都會將相關(guān)的HTTP頭放到$_SERVER變量中,也加深了http協(xié)議的了解
相關(guān)文章
PHP中SESSION使用中的一點(diǎn)經(jīng)驗總結(jié)
最近在網(wǎng)上的交流中發(fā)現(xiàn)大家對SESSION的使用上有很多誤區(qū),本質(zhì)上就是不了解SESSION的工作原理2012-03-03PHP用戶管理中常用接口調(diào)用實例及解析(含源碼)
本文主要介紹了PHP用戶管理中常用接口調(diào)用實例及解析(含源碼),具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03php獲得網(wǎng)站訪問統(tǒng)計信息類Compete API用法實例
這篇文章主要介紹了php獲得網(wǎng)站訪問統(tǒng)計信息類Compete API用法,實例分析了php使用curl獲取Compete統(tǒng)計網(wǎng)站信息的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04