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生成带有雪花背景的验证码
Sep 28 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
Nov 23 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
理解PHP中的stdClass类
Apr 18 PHP
php中使用session防止用户非法登录后台的方法
Jan 27 PHP
ThinkPHP中order()使用方法详解
Apr 19 PHP
PHP微信开发之有道翻译
Jun 23 PHP
PHP实现批量检测网站是否能够正常打开的方法
Aug 23 PHP
php微信开发接入
Aug 27 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
Sep 11 PHP
php实现支付宝当面付(扫码支付)功能
May 30 PHP
php unlink()函数使用教程
Jul 12 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
我的论坛源代码(七)
2006/10/09 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
2017/03/04 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
利用Electron简单撸一个Markdown编辑器的方法
2019/06/10 Javascript
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
jquery实现有过渡效果的tab切换
2020/07/17 jQuery
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
PHP webshell检查工具 python实现代码
2009/09/15 Python
python不带重复的全排列代码
2013/08/13 Python
Python实现获取网站PR及百度权重
2015/01/21 Python
python中管道用法入门实例
2015/06/04 Python
总结Python编程中函数的使用要点
2016/03/20 Python
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
python ftplib模块使用代码实例
2019/12/31 Python
jupyter notebook 重装教程
2020/04/16 Python
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
给小学生的新年寄语
2014/04/04 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
七年级作文之英语老师
2019/10/28 职场文书
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电
如何Python使用re模块实现okenizer
2022/04/30 Python