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侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
Oct 15 PHP
PHP 柱状图实现代码
Dec 04 PHP
PHP中uploaded_files函数使用方法详解
Mar 09 PHP
PHP curl 并发最佳实践代码分享
Sep 05 PHP
php实现比较全的数据库操作类
Jun 18 PHP
PHP简单创建压缩图的方法
Aug 24 PHP
php 判断过去离现在几年的函数(实例代码)
Nov 15 PHP
使用ThinkPHP生成缩略图及显示
Apr 27 PHP
老生常谈PHP面向对象之解释器模式
May 17 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
php5.x禁用eval的操作方法
Oct 19 PHP
thinkphp5实现微信扫码支付
Dec 23 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读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
prototype Element学习笔记(篇二)
2008/10/26 Javascript
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
JavaScript实现瀑布流布局的3种方式
2020/12/27 Javascript
python ddt实现数据驱动
2018/03/14 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
Python理解递归的方法总结
2019/01/28 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
营销与策划应届生求职信
2013/11/04 职场文书
乐观大学生的自我评价
2014/01/10 职场文书
敬老文明号事迹材料
2014/01/16 职场文书
管理建议书范文
2014/05/13 职场文书
效能风暴心得体会
2014/09/04 职场文书
树转促学习心得体会
2014/09/10 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
家长会主持词开场白
2015/05/29 职场文书
新年祝酒词大全
2015/08/11 职场文书
导游词之西安骊山
2019/12/03 职场文书
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python