在我的一个网站上,我只是将用户图像存储在其用户文件夹中为“1.jpg”。这意味着每当他们更改个人资料图片时,文件名都会保持不变。
我一直想利用图片缓存,以便在查看和重新查看用户的个人资料时,不会一次又一次地下载相同的旧图片,但与此同时,我希望我的用户'浏览器如果已更改,则下载新的浏览器。
我怎么能用PHP做到这一点?
答案 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)
一种常用的解决方案是让您的图片网址如下所示:
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
是一个虚拟查询字符串,就像我上面描述的那样;您可以通过更改它并确定它确实仍然返回相同的文件来确认。