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连接Oracle for NT 远程数据库
Oct 09 PHP
用PHP查询域名状态whois的类
Nov 25 PHP
php设计模式  Command(命令模式)
Jun 17 PHP
解析php如何将日志写进syslog
Jun 28 PHP
php保存二进制原始数据为图片的程序代码
Oct 14 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
php计算多维数组中所有值总和的方法
Jun 24 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
Sep 25 PHP
全新Mac配置PHP开发环境教程
Feb 03 PHP
自制PHP框架之模型与数据库
May 07 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
Aug 20 PHP
PHP命名空间与自动加载类详解
Sep 04 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
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
PHP数据集构建JSON格式及新数组的方法
2012/11/07 PHP
php无限遍历目录示例
2014/02/21 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
javascript中call,apply,bind函数用法示例
2016/12/19 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
python动态视频下载器的实现方法
2019/09/16 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
Python的pygame安装教程详解
2020/02/10 Python
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
小学教育毕业生自荐信
2013/11/18 职场文书
党校培训自我鉴定
2014/02/01 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
给朋友的道歉短信
2015/05/12 职场文书
详解Nginx 工作原理
2021/03/31 Servers
7个你应该知道的JS原生错误类型
2021/04/29 Javascript
Mysql如何实现不存在则插入,存在则更新
2022/03/25 MySQL
python 实现图片特效处理
2022/04/03 Python