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 相关文章推荐
服务器web工具 php环境下
Dec 29 PHP
PHP与SQL注入攻击防范小技巧
Sep 16 PHP
PHP 关于访问控制的和运算符优先级介绍
Jul 08 PHP
php获取随机数组列表的方法
Nov 13 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
Apr 17 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
Nov 25 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
PHP的Trait机制原理与用法分析
Oct 18 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 PHP
TP5框架实现的数据库备份功能示例
Apr 05 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
计算一段日期内的周末天数的php代码(星期六,星期日总和)
2009/11/12 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
PHP超全局数组(Superglobals)介绍
2015/07/01 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
PHP levenshtein()函数用法讲解
2019/03/08 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
javascript深入理解js闭包
2010/07/03 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
详解Javascript 装载和执行
2014/11/17 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
angular 服务随记小结
2019/05/06 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
python实现mysql的读写分离及负载均衡
2018/02/04 Python
详解Django CAS 解决方案
2019/10/30 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
高中军训感言500字
2014/02/24 职场文书
商务经理岗位职责
2014/07/30 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
公司市场部岗位职责
2015/04/15 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书
把77A收信机改造成收音机
2022/04/05 无线电
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js
MySQL的存储过程和相关函数
2022/04/26 MySQL