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设计模式 Visitor 访问者模式
Jun 28 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
php获取淘宝分类id示例
Jan 16 PHP
两个php日期控制类实例
Dec 09 PHP
PHP+Mysql基于事务处理实现转账功能的方法
Jul 08 PHP
thinkPHP删除前弹出确认框的简单实现方法
May 16 PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 PHP
PHP大神的十大优良习惯
Sep 14 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
详解在YII2框架中使用UEditor编辑器发布文章
Nov 02 PHP
在Laravel中实现使用AJAX动态刷新部分页面
Oct 15 PHP
thinkphp 获取控制器及控制器方法
Apr 16 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
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
2013/06/26 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
php实现微信支付之退款功能
2018/05/30 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
JS拖动技术 关于setCapture使用
2010/12/09 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
2016/05/10 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
Vue配置marked链接添加target="_blank"的方法
2019/07/19 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
Python基本数据类型详细介绍
2014/03/11 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
python使用生成器实现可迭代对象
2018/03/20 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
python pytest进阶之fixture详解
2019/06/27 Python
解决Pycharm的项目目录突然消失的问题
2020/01/20 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
python中pickle模块浅析
2020/12/29 Python
公司年会演讲稿范文
2014/01/11 职场文书
初中科学教学反思
2014/01/21 职场文书
《小池塘》教学反思
2014/02/28 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
运动会入场口号
2014/06/07 职场文书
中层干部考核评语
2015/01/04 职场文书
交流会主持词
2015/07/02 职场文书
幼儿园小班班务总结
2015/08/03 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB