程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP文件生成的圖片無法使用CDN緩存的解決方法

PHP文件生成的圖片無法使用CDN緩存的解決方法

編輯:關於PHP編程

       這篇文章主要介紹了PHP文件生成的圖片無法使用CDN緩存的解決方法,這裡的PHP生成圖片是指src地址是一個PHP文件的圖片,如果不做CDN,服務器的壓力會非常大,本文就講解了如何加進CDN的方法,需要的朋友可以參考下

      今天發現線上有個問題,線上一個圖片域名,在前端已經加了CDN緩存,不落緩存,則用PHP動態實現圖片縮放,但經PHP處理過的圖片輸出後,每次都要從後端讀取,後端服務器壓力瞬間增加,經分析,PHP中沒有作304的處理,

      HTTP的原理是這樣的,每次請求到服務器後,服務端檢測有沒有修改,如沒有修改,可以直接返回一個304的狀態碼,這樣就用客戶端的緩存了,CDN的原理就是如此,如果設置了304,就會將相應的URL進行緩存起來;

      相關代碼如下:

       代碼如下:

      //檢測有沒改變

      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,一般是服務器返回的對某一URL的標識,一般用MD5計算,這樣我們檢測MD5值對不對,相同就可以返回304了;

      PS:

      剛開始抓了半天包,只看到服務端返回的Etag標簽,沒看到客戶端的http頭中If-None-Match,害得在fastcgi.conf.default 中加入如下代碼:

      復制代碼 代碼如下:

      fastcgi_param CACHE_ETAG $http_if_none_match;

      一打印$_SERVER,根本就沒有CACHE_ETAG這個變量,看來nginx都會將相關的HTTP頭放到$_SERVER變量中,也加深了http協議的了解

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved