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 相关文章推荐
一个目录遍历函数
Oct 09 PHP
php反弹shell实现代码
Apr 22 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
May 18 PHP
基于php缓存的详解
May 15 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
Oct 14 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
Mar 19 PHP
php字符串函数学习之substr()
Mar 27 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
php获取本机真实IP地址实例代码
Mar 31 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
May 03 PHP
PHP实现简易计算器功能
Aug 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命名空间(namespace)的使用基础及示例
2014/08/18 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
2007/01/22 Javascript
js兼容标准的表格变色效果
2008/06/28 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
webpack打包node.js后端项目的方法
2018/03/10 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
python输出指定月份日历的方法
2015/04/23 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
Python性能提升之延迟初始化
2016/12/04 Python
Python 对输入的数字进行排序的方法
2018/06/23 Python
python实现周期方波信号频谱图
2018/07/21 Python
基于Django实现日志记录报错信息
2019/12/17 Python
python ftplib模块使用代码实例
2019/12/31 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
python中re模块知识点总结
2021/01/17 Python
总经理助理工作职责
2014/02/06 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
政风行风建设整改方案
2014/10/27 职场文书
大学生就业意向书
2015/05/11 职场文书
2016国庆促销广告语
2016/01/28 职场文书
煤矿安全生产管理协议书
2016/03/22 职场文书
合作意向书怎么写
2019/06/24 职场文书
六年级作文之关于梦
2019/10/22 职场文书
Javascript之datagrid查询详解
2021/09/15 Javascript