使用PHP缓存生成的图像

时间:2012-12-10 15:52:20

标签: php html apache image-caching

我有一个脚本,它在服务器上用PHP生成一个图像,格式为image.png。然后我使用<img src="http://domain.com/images/image.png" />在不同的地方使用此图片。

我遇到的问题是,即使图像每30分钟重新生成一次,它似乎也会被缓存,并且在我转到http://domain.com/images/image.png然后{{1}之前不会显示新值}}

有什么方法可以保持图像名称相同,但是它总是显示图像的最新版本吗?

3 个答案:

答案 0 :(得分:4)

发生这种情况时,浏览器缓存超过30分钟。由于您的图片每30分钟生成一次,您应相应地设置ExpiresCache-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. 检查图像文件是否存在
    • 如果早于我的缓存持续时间删除它,然后生成新图像。
  2. 如果图像文件不存在
    • 生成图像并保存
  3. 现在我们有一个有效的图像。
  4. 计算图像的文件修改日期,并用它添加缓存持续时间。
  5. 使用正确的标题进行投放,其中过期日期将是我们在第4步计算的值。

答案 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" />