【问题标题】:How to cache an image being served through PHP?如何缓存通过 PHP 提供的图像?
【发布时间】:2012-09-04 02:05:25
【问题描述】:

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

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

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

【问题讨论】:

  • 提供正确的缓存头/控制。此外,需要“聪明地”读取文件以检查没有完整读取的更改..如果需要的话。

标签: php caching header


【解决方案1】:

我总是使用 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);

【讨论】:

  • 好像在firefox下可以用,但是在chrome下,每次好像还是要加载图片
  • 一直在 Chrome 中为我工作,你在刷新吗?您应该知道,当您点击刷新时,Chrome 会刷新所有内容,只需使用链接重新加载该页面..
  • 啊,我明白了!是的,我正在刷新
  • 即使我只是复制粘贴网址并按回车键,它似乎仍然在 chrome 中重新加载它..
  • PHP 会自动处理 If-Not-Modified 吗?或者,考虑使用 Expiry 标头以避免必须响应客户端请求。
【解决方案2】:

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

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

【讨论】:

  • 如果您告诉浏览器发送未修改,浏览器只会收到未修改。这需要查看 If-Modified-Since 和类似内容。 (或者另一层可以检查标头,我不确定 PHP 或它的托管机制是否有效。)
【解决方案3】:

我建议添加一个标头来告诉图像文件的最后修改日期:

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

这样浏览器就可以缓存图片了。

【讨论】:

  • 这是一个开始。但它不会阻止浏览器重新请求资源(从而重新获取图像).. 仍然带有 Last-Modified 标头。 Last-Modified 设计用于与来自客​​户端的 If-Modified-Since 标头(等​​)一起使用。 (或者另一层可以检查标头,我不确定 PHP 或它的托管机制是否有效。)
猜你喜欢
  • 2017-12-26
  • 2011-02-22
  • 2014-04-23
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 2011-03-02
相关资源
最近更新 更多