如何利用图像缓存同时跟踪图像何时发生变化?

时间:2012-07-20 17:39:17

标签: php image file caching browser-cache

在我的一个网站上,我只是将用户图像存储在其用户文件夹中为“1.jpg”。这意味着每当他们更改个人资料图片时,文件名都会保持不变。

我一直想利用图片缓存,以便在查看和重新查看用户的个人资料时,不会一次又一次地下载相同的旧图片,但与此同时,我希望我的用户'浏览器如果已更改,则下载新的浏览器。

我怎么能用PHP做到这一点?

3 个答案:

答案 0 :(得分:2)

最简单的解决方法是为每个用户的个人资料选择分配一个随机名称GUID.jpg。每当他们改变他们的个人资料时,为他们分配一个新的GUID。

现在,您可以通过向客户端发送指令来为此配置文件pic提供服务,以便永久缓存它。

答案 1 :(得分:0)

电子标记,最后修改,基本上是标题,使浏览器能够决定资源(即配置文件图片)是否已更改以及是否从服务器下载或从缓存中检索它。

我建议使用php来调用图片而不是直接链接它吗?

<?php $lmt = filemtime($_GET['file']); $etag = md5($lmt); header('Content-type: application/x-javascript'); header("Cache-Control: max-age=3600"); header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lmt)." GMT"); header("ETag: ".'"'.$etag.'"'); if(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lmt || trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) { header("HTTP/1.1 304 Not Modified"); exit; } ?>

然后将在此代码段下方加载内容

答案 2 :(得分:0)

在这里回答:https://webmasters.stackexchange.com/questions/32481/is-it-worth-it-to-change-my-entire-user-images-file-structure-to-take-advantage


一种常用的解决方案是让您的图片网址如下所示:

http://www.example.com/path/to/images/1.jpg?v=123456

在这里,/path/to/images/1.jpg是图像的实际URL路径,而?v=123456只是一个虚拟查询,盯着URL的末尾。查询字符串可以是任何内容 - 版本号,时间戳,图像内容的哈希值 - 只要您在图像更改时更改它,并在不更改时保持相同。

诀窍是,当要求提供此类URL时,Web服务器将忽略查询字符串,因为URL实际上指向静态文件。但是对于用户的浏览器(以及其间的任何代理),具有不同查询字符串的URL将完全不同,因此对查询字符串的任何更改都会强制浏览器重新加载文件。

因此,您可以将Web服务器配置为发送ExpiresCache-Control HTTP标头以允许无限期缓存,您可以通过更改查询字符串来强制重新加载。一种方法,如果您使用Apache mod_expires,则将.htaccess文件放在图像目录中,并带有以下行:

ExpiresActive On
ExpiresDefault "access plus 1 year"

许多热门网站都使用这种技术。例如,如果你查看这个页面的HTML源代码,你会发现它的样式表是从这样的URL加载的:

http://cdn.sstatic.net/stackoverflow/all.css?v=7cd8ea9d6f1e

这里,?v=7cd8ea9d6f1e是一个虚拟查询字符串,就像我上面描述的那样;您可以通过更改它并确定它确实仍然返回相同的文件来确认。