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编程网上资源导航
Oct 09 PHP
PHP+DBM的同学录程序(1)
Oct 09 PHP
第三节--定义一个类
Nov 16 PHP
php的urlencode()URL编码函数浅析
Aug 09 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
PHP封装的Twitter访问类实例
Jul 18 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
Feb 22 PHP
php简单实现批量上传图片的方法
May 09 PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 PHP
php实现和c#一致的DES加密解密实例
Jul 24 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
Oct 24 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
上海无线电三厂简史修改版
2021/03/01 无线电
php为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
javascript removeChild 使用注意事项
2009/04/11 Javascript
基于jquery的3d效果实现代码
2011/03/23 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
详解jQuery选择器
2016/12/21 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
跨平台python异步回调机制实现和使用方法
2013/11/26 Python
win与linux系统中python requests 安装
2016/12/04 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
Python 实现自动获取种子磁力链接方式
2020/01/16 Python
python实现加密的方式总结
2020/01/19 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
C语言编程题
2015/03/09 面试题
介绍一下Linux文件的记录形式
2012/04/18 面试题
人力资源管理专业学生自我评价
2013/11/20 职场文书
经典优秀个人求职信分享
2013/12/12 职场文书
招商业务员岗位职责
2013/12/16 职场文书
大型活动策划方案
2014/01/12 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
党员四风问题对照检查材料
2014/09/27 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
运动会广播稿100字
2015/08/19 职场文书
最新的离婚协议书范本!
2019/07/02 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js