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+mysql实现无限级分类 | 树型显示分类关系
Nov 19 PHP
深入探讨PHP中的内存管理问题
Aug 31 PHP
phpmyadmin3 安装配置图解教程
Mar 29 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
php实现把url转换迅雷thunder资源下载地址的方法
Nov 07 PHP
php导入大量数据到mysql性能优化技巧
Dec 29 PHP
PHP中实现Bloom Filter算法
Mar 30 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
Feb 18 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
Sep 30 PHP
PHP多进程简单实例小结
Nov 09 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 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 中include()与require()的对比
2006/10/09 PHP
mysql中存储过程、函数的一些问题
2007/02/14 PHP
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
asp.net和php的区别点总结
2019/10/10 PHP
如何在PHP中使用数组
2020/06/09 PHP
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
详解ES6中的代理模式——Proxy
2018/01/08 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
Python中元组,列表,字典的区别
2017/05/21 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
python从子线程中获得返回值的方法
2019/01/30 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
python和node.js生成当前时间戳的示例
2020/09/29 Python
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
英国床垫在线:Mattress Online
2016/12/07 全球购物
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
工厂仓管员岗位职责
2014/01/01 职场文书
音乐教学随笔感言
2014/02/19 职场文书
共产党员公开承诺践诺书
2014/05/28 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
情况说明书怎么写
2015/10/08 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL