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


Posted in PHP onJune 20, 2015

今天发现线上有个问题,线上一个图片域名,在前端已经加了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 相关文章推荐
用PHP为SHOPEX增加日志功能代码
Jul 02 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
深入php 正则表达式的学习探讨
Jun 06 PHP
php中通过数组进行高效随机抽取指定条记录的算法
Sep 09 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
初识Laravel
Oct 30 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
Dec 08 PHP
[原创]php简单防盗链验证实现方法
Jul 09 PHP
PHP实现的随机IP函数【国内IP段】
Jul 20 PHP
thinkPHP5 tablib标签库自定义方法详解
May 10 PHP
PHP时间戳和日期相互转换操作实例小结
Dec 18 PHP
Thinkphp整合阿里云OSS图片上传实例代码
Apr 28 PHP
php简单统计字符串单词数量的方法
Jun 19 #PHP
PHP对文件夹递归执行chmod命令的方法
Jun 19 #PHP
php强制用户转向www域名的方法
Jun 19 #PHP
php自动更新版权信息显示的方法
Jun 19 #PHP
php中Snoopy类用法实例
Jun 19 #PHP
php计算整个目录大小的方法
Jun 19 #PHP
php简单计算页面加载时间的方法
Jun 19 #PHP
You might like
PHP中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
探讨如何把session存入数据库
2013/06/07 PHP
浅析php header 跳转
2013/06/17 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
php中foreach结合curl实现多线程的方法分析
2016/09/22 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
Django实现分页显示效果
2019/10/31 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
捷科时代的软件测试笔试题
2015/11/09 面试题
代码中finally中的代码会不会执行
2012/02/06 面试题
优秀教师事迹简介
2014/02/02 职场文书
主题婚礼策划方案
2014/02/10 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
十大最强妖精系宝可梦,哲尔尼亚斯实力最强,第五被称为大力士
2022/03/18 日漫
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL