我有一个脚本,它在服务器上用PHP生成一个图像,格式为image.png。然后我使用<img src="http://domain.com/images/image.png" />
在不同的地方使用此图片。
我遇到的问题是,即使图像每30分钟重新生成一次,它似乎也会被缓存,并且在我转到http://domain.com/images/image.png然后{{1}之前不会显示新值}}
有什么方法可以保持图像名称相同,但是它总是显示图像的最新版本吗?
答案 0 :(得分:4)
发生这种情况时,浏览器缓存超过30分钟。由于您的图片每30分钟生成一次,您应相应地设置Expires
和Cache-control
标题。
请参阅这些标题。
Expires: Mon, 10 Dec 2012 16:25:18 GMT
Cache-Control: max-age=1800
此处Expries
设置为从现在开始30分钟(Date: Mon, 10 Dec 2012 15:55:18 GMT
)。并且还需要设置Cache-Control
。该单位在这里排名第二。
我将这些标题用于图像生成站点,其中缓存持续时间为60分钟。这些是我遵循缓存它的规则。
答案 1 :(得分:3)
根据您的具体情况,有几种选择。如果“images / image.png”是服务器上的实际文件而您直接访问它,则必须更改文件夹上的缓存设置或使用.htaccess通知浏览器重新发送。
<FilesMatch "\.(ico¦pdf¦flv¦jpg¦jpeg¦png¦gif¦js¦css¦swf)$">
ExpiresDefault A604800
Header set cache-control: "no-cache, public, must-revalidate"
</FilesMatch>
如果您使用PHP查找图像并将其返回,则可以使用PHP发送标题。
header("Expires: ".gmdate("D, d M Y H:i:s", time()+1800)." GMT");
header("Cache-Control: max-age=1800");
要完美地使用PHP,您可以检查它是否实际修改了
$last_modified_time = @filemtime($file);
header("Expires: ".gmdate("D, d M Y H:i:s", $last_modified_time+1800)." GMT");
//change with $last_modified_time instead of time().
//Else if you request it 29mins after it was first created, you still have to wait 30mins
//but the image is recreated after 1 min.
header("Cache-Control: max-age=1800");
header("Vary: Accept-Encoding");
// exit if not modified
if (array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)) {
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time) {
header("HTTP/1.1 304 Not Modified");
return;
}
}
答案 2 :(得分:0)
您可以尝试使用PHP加载图像:
<?php
//generateImage.php
$path = "xxxx/xxx.jpg";
$img =imagecreatefromjpeg($path);
header("Content-Type: image/jpeg");
imagejpeg($img);
imagedestroy($img);
?>
然后像这样调用图像:
<img src="http://domain.com/generateImage.php" />