如何缓存通过PHP提供的图像


How to cache an image being served through PHP?

我正在将我的网站的背景图像设置为服务器上的url,这是一个php脚本,它将图像作为输出。这是它的代码:

   //$mime is usually image/jpeg, etc
   header("Content-type: $mime");
   $image = readfile($image);
   imagejpeg($image);

问题是,每次我加载页面时,图像似乎都会再次加载,而不是缓存。对此我能做些什么吗,例如发送一个标头来缓存图像?

我总是使用ETag(md5哈希)和Last Modified(过去的日期,通常是创建文件的时候)来获得最佳结果。

对于您的代码,它将是这样的:

$etag = md5_file($image);
$lastModified = gmdate('D, d M Y H:i:s', filemtime($image)) . ' GMT';

header("Content-type: $mime");
header("ETag: '"{$etag}'"");
header("Last-Modified: $lastModified");
header('Expires: ' . gmdate("D, d M Y H:i:s", ((60*60*24*45)+strtotime($lastModified)))); // add 45 days expire
$image = readfile($image);
imagejpeg($image);

使用上次修改的标题字段,并始终将其设置为过去的日期。

这样,浏览器将收到来自服务器的"未修改"回复,并将使用图像的缓存版本。

我建议添加一个标题来告诉图像文件上次修改的日期:

 header("Last-Modified: " . gmdate("D, d M Y H:i:s", filemtime($image)) . " GMT");
 header("Content-type: $mime");
 $image = readfile($image);
 imagejpeg($image);

通过这种方式,浏览器将能够缓存图像。