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+Html+缓存
Nov 25 PHP
php ignore_user_abort与register_shutdown_function 使用方法
Jun 14 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
May 07 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
Jul 18 PHP
用C/C++扩展你的PHP 为你的php增加功能
Sep 06 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
浅谈PHP解析URL函数parse_url和parse_str
Nov 11 PHP
php metaphone()函数的定义和用法
May 15 PHP
PHP引用返回用法示例
May 28 PHP
PHP入门教程之面向对象基本概念实例分析
Sep 11 PHP
Mac下php 5升级到php 7的步骤详解
Apr 26 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 5.0创建图形的巧妙方法
2010/10/12 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
2014/06/20 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
微信小程序实现上拉加载功能
2019/11/20 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
VUE动态生成word的实现
2020/07/26 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
Python实现的几个常用排序算法实例
2014/06/16 Python
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
python实现kmp算法的实例代码
2019/04/03 Python
基于python实现从尾到头打印链表
2019/11/02 Python
Python爬虫爬取杭州24时温度并展示操作示例
2020/03/27 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
关于HTML5语义标签的实践(blog页面)
2016/07/12 HTML / CSS
Born鞋子官网:Born Shoes
2017/04/06 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
应届毕业生求职信范例分享
2013/12/17 职场文书
机电专业个人求职信范文
2013/12/30 职场文书
工厂实习感言
2014/01/14 职场文书
让世界充满爱演讲稿
2014/05/24 职场文书
贸易经济专业自荐书
2014/06/29 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
降价通知函
2015/04/23 职场文书
2015年行政管理人员工作总结
2015/10/15 职场文书