PHP文件生成的图片无法使用CDN缓存的解决方法
2015-06-20 00:00
886 查看
今天发现线上有个问题,线上一个图片域名,在前端已经加了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协议的了解
相关文章推荐
- php post大量数据时发现数据丢失问题解决方法
- php文件操作之小型留言本实例
- php写入、删除与复制文件的方法
- php文件读取方法实例分析
- php单一接口的实现方法
- php多重接口的实现方法
- php传值赋值和传地址赋值用法实例分析
- php类的扩展和继承用法实例
- php判断对象是派生自哪个类的方法
- php实现对象克隆的方法
- PHP发邮件的类以及类的方法调用
- Yii2.0 图文安装配置教程
- Yii2.0.4.手册.chm 教程
- Yii2.0引入CSS,JS文件方法
- Yii2.0 整合elfinder图片管理器调用方法
- Yii2.0注册验证model与view方法调用
- Yii1 rules常用规则大全
- Yii2.0 rules验证规则大全
- Yii2.0 数据库查询操作
- ThinkPHP3.2 快速入门基础