在我的一个网站上,我只是将我的用户图像作为“1.jpg”存储在他们的用户文件夹中。这意味着每当他们更改个人资料图片时,文件名都保持不变。
我一直想利用图像缓存,以便在查看和重新查看用户的个人资料时不会一遍又一遍地下载相同的旧图片,但同时,我希望我的用户的浏览器能够如果有变化,请下载新的。
我怎么能在 PHP 中做到这一点?
在我的一个网站上,我只是将我的用户图像作为“1.jpg”存储在他们的用户文件夹中。这意味着每当他们更改个人资料图片时,文件名都保持不变。
我一直想利用图像缓存,以便在查看和重新查看用户的个人资料时不会一遍又一遍地下载相同的旧图片,但同时,我希望我的用户的浏览器能够如果有变化,请下载新的。
我怎么能在 PHP 中做到这一点?
最简单的解决方法是为每个用户的配置文件选择分配一个随机名称 GUID.jpg。每当他们更改个人资料图片时,都会为他们分配一个新的 GUID。
现在,您可以将此配置文件图片与客户端的指令一起发送到服务器以永久缓存它。
E-Tagging,Last-modified,基本上是允许浏览器决定资源(即配置文件图片)是否已更改以及是否从您的服务器下载它或从缓存中检索它的标题。
我可以建议使用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;
}
?>
然后将在此代码段下方加载内容
一种常用的解决方案是使您的图像 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 服务器配置为发送Expires
和Cache-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
就像我上面描述的那样,是一个虚拟查询字符串;您可以通过更改它并查看它确实仍然返回相同的文件来确认这一点。