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

最近对公司的APP进行优化,首要解决的是图片展示的问题,之前都是原图展示,很耗流量和内存,其次也影响请求的时间。所以决定采用压缩图片。

服务端通过PHP动态的对图片进行压缩和裁剪,客户端提供相应的参数就可以获取到对应的图片了。

但是有个问题,我们的图片走了CDN的,如果动态的生成图片,往往就无法利用CDN了。

后来再网上搜集了一些资料,最终如下解决:

$last_modified_time = filemtime($imgoath);
$etag = md5_file($imgoath);
// always send headers
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
header("Etag: $etag");
// exit if not modified
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) 
        && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time 
        || trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
    header("HTTP/1.1 304 Not Modified");
    exit;
}

$put = file_get_contents($imgoath);
header("Content-type: image/jpg");
echo $put;

HTTP的原理是这样的,每次请求到服务器后,服务端检测有没有修改,如没有修改,可以直接返回一个304的状态码,这样就用客户端的缓存了,CDN的原理就是如此,如果设置了304,就会将相应的URL进行缓存起来。

标签: none

添加新评论