如何在跟踪图像更改的同时利用图像缓存


How to take advantage of Image caching while keeping track of when images have changed?

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

我一直想利用图像缓存,这样每当用户的个人资料被查看和重新查看时,就不会一次又一次地下载同一张旧照片,但同时,如果新照片发生了变化,我希望我的用户浏览器下载它。

我怎么能在PHP中做到这一点?

最简单的修复方法是为每个用户的配置文件pick分配一个随机名称GUID.jpg。每当他们更改配置文件pic时,都会为他们分配一个新的GUID。

现在,您可以将此配置文件图片与指令一起发送给客户端,以便永远缓存它。

E-Tagging,上次修改,基本上是头,使浏览器能够决定资源(即配置文件图片)是否已更改,以及是否从服务器下载或从缓存中检索。

我可以建议使用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; } ?>

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

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


一个常用的解决方案是让你的图像URL看起来像这样:

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标头,以允许无限缓存,因为您知道可以通过更改查询字符串来强制重新加载。如果您使用的是带有mod_expires的Apache,那么一种方法是在映像目录中放入一个.htaccess文件,行为:

ExpiresActive On
ExpiresDefault "access plus 1 year"

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

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

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