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 Web开发MVC框架的Smarty使用说明
Apr 19 PHP
php jquery 多文件上传简单实例
Dec 23 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
PHP发送AT指令实例代码
May 26 PHP
Laravel 5.3 学习笔记之 安装
Aug 28 PHP
PHP之十六个魔术方法详细介绍
Nov 01 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
php实现连接access数据库并转txt写入的方法
Feb 08 PHP
php文件上传类的分享
Jul 06 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
PHP7新特性
Mar 09 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通过递归方式复制目录和子目录的方法
2015/03/13 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
PHP错误处理函数
2016/04/03 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
js常用函数 不错
2006/09/08 Javascript
事件绑定之小测试  onclick && addEventListener
2011/07/31 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
简单谈谈json跨域
2016/03/13 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
Python标准库defaultdict模块使用示例
2015/04/28 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
Python IDLE入门简介
2017/12/08 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
python中int与str互转方法
2018/07/02 Python
python实现排序算法解析
2018/09/08 Python
在python中安装basemap的教程
2018/09/20 Python
python并发和异步编程实例
2018/11/15 Python
Flask框架web开发之零基础入门
2018/12/10 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
Python命令行click参数用法解析
2019/12/19 Python
python使用hdfs3模块对hdfs进行操作详解
2020/06/06 Python
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
公务员个人年终总结
2015/02/12 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书