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 上传文件类型判断函数(避免上传漏洞 )
Jun 08 PHP
PHP中输出转义JavaScript代码的实现代码
Apr 22 PHP
smarty 缓存控制前的页面静态化原理
Mar 15 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
Jun 09 PHP
php实现的短网址算法分享
Jun 20 PHP
php中通过DirectoryIterator删除整个目录的方法
Mar 13 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
Symfony2学习笔记之插件格式分析
Mar 17 PHP
PHP实现JS中escape与unescape的方法
Jul 11 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
Mar 13 PHP
PHP实现合并两个排序链表的方法
Jan 19 PHP
php中的钩子理解及应用实例分析
Aug 30 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
从MySQL数据库表中取出随机数据的代码
2007/09/05 PHP
PHP 中文处理技巧
2010/04/25 PHP
跟我学Laravel之请求与输入
2014/10/15 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
PHP使用数组实现矩阵数学运算的方法示例
2017/05/29 PHP
PHP小白必须要知道的php基础知识(超实用)
2017/10/10 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
浅析node.js中close事件
2014/11/26 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
node.js到底要不要加分号浅析
2018/07/11 Javascript
Vue 项目分环境打包的方法示例
2018/08/03 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
Python实现购物系统(示例讲解)
2017/09/13 Python
好的Python培训机构应该具备哪些条件
2018/05/23 Python
Python3实现计算两个数组的交集算法示例
2019/04/03 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
阿拉伯书店:Jamalon
2019/07/24 全球购物
医学生个人求职信范文
2013/09/24 职场文书
求职自荐书范文
2013/12/04 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
英文留学推荐信范文
2014/01/25 职场文书
个人课题方案
2014/05/08 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
北京颐和园导游词
2015/01/30 职场文书