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 MSSQL 存储过程的方法
Dec 24 PHP
一个基于PDO的数据库操作类
Mar 24 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
深入PHP数据加密详解
Jun 18 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
Nov 13 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php实现以只读方式打开文件的方法
Mar 16 PHP
PHP检测链接是否存在的代码实例分享
May 06 PHP
php数值转换时间及时间转换数值用法示例
May 18 PHP
浅谈PHP中new self()和new static()的区别
Aug 11 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
PHP PDOStatement::fetchAll讲解
Jan 31 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实现获取文件mime类型的方法
2015/02/11 PHP
教大家制作简单的php日历
2015/11/17 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
利用jQuery的$.event.fix函数统一浏览器event事件处理
2009/12/21 Javascript
十个优秀的Ajax/Javascript实例网站收集
2010/03/31 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
2017/01/20 Javascript
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
python开发之函数定义实例分析
2015/11/12 Python
python WindowsError的错误代码详解
2017/07/23 Python
python编程线性回归代码示例
2017/12/07 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
解决Python3中的中文字符编码的问题
2018/07/18 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
用Python实现职工信息管理系统
2020/12/30 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
销售会计工作职责
2013/12/02 职场文书
热门专业求职信
2014/05/24 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
银行授权委托书范本
2014/10/04 职场文书
学年个人总结范文
2015/03/05 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
Spring中bean集合注入的方法详解
2022/07/07 Java/Android
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript