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進行緩存起來;
相關(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的標識,一般用MD5計算,這樣我們檢測MD5值對不對,相同就可以返回304了;
PS:
剛開始抓了半天包,只看到服務(wù)端返回的Etag標簽,沒看到客戶端的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中call_user_func函數(shù)使用注意事項
這篇文章主要介紹了php中call_user_func函數(shù)使用注意事項,較為詳細的講述了call_user_func函數(shù)的用法實例與注意事項,具有一定的參考借鑒價值,需要的朋友可以參考下2014-11-11
對象失去焦點時自己動提交數(shù)據(jù)的實現(xiàn)代碼
生產(chǎn)線上,提升輸入員輸入效率,在沒有購買到Bar code槍之前,需要修改程序,即是說當mouse光標離開TextBox之后,數(shù)據(jù)自動提交到數(shù)據(jù)庫中2012-11-11
提示Trying to clone an uncloneable object of class Imagic的解決
使用網(wǎng)上流傳的一個程序?qū)崿F(xiàn)pdf截圖為png,需要使用Imagic擴展,安裝后出現(xiàn)Trying to clone an uncloneable object of class Imagic提示,下面是具體的解決方法分享。2011-10-10
PHP實現(xiàn)支持GET,POST,Multipart/form-data的HTTP請求類
這篇文章主要介紹了PHP實現(xiàn)支持GET,POST,Multipart/form-data的HTTP請求類,包括了連接與處理方式及相關(guān)的技巧,需要的朋友可以參考下2014-09-09

