欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP文件生成的图片无法使用CDN缓存的解决方法

程序员文章站 2022-06-22 20:42:42
今天发现线上有个问题,线上一个图片域名,在前端已经加了cdn缓存,不落缓存,则用php动态实现图片缩放,但经php处理过的图片输出后,每次都要从后端读取,后端服务器压力瞬间...

今天发现线上有个问题,线上一个图片域名,在前端已经加了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协议的了解