>백엔드 개발 >PHP 튜토리얼 >PHP文件生成的图片无法使用CDN缓存的解决方法_PHP教程

PHP文件生成的图片无法使用CDN缓存的解决方法_PHP教程

WBOY
WBOY원래의
2016-07-13 09:49:19870검색

PHP文件生成的图片无法使用CDN缓存的解决方法

   这篇文章主要介绍了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协议的了解

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1020284.htmlTechArticlePHP文件生成的图片无法使用CDN缓存的解决方法 这篇文章主要介绍了PHP文件生成的图片无法使用CDN缓存的解决方法,这里的PHP生成图片是指s...
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.