【问题标题】:Cache php-generated image until it changes缓存 php 生成的图像,直到它改变
【发布时间】:2012-07-10 01:42:51
【问题描述】:

对于我缺乏这方面的知识,我提前道歉;我查看了很多其他帖子,但无法找到适合我的任何解决方案。

无论如何,我正在使用动态 displayimage.php 文件在我正在开发的网站上显示用户的个人资料图片。该页面采用 id 参数,并从 mysql 数据库中提取图像文件名。这是(缩写的)代码:

$id = mysql_real_escape_string($_GET[id]);

$table = "images_user";
$idname = "userid";
$uploaddir = "/home/username/uploads/images/user/"; //outside web root

$select = mysql_query("SELECT * FROM $table WHERE $idname = '$id' LIMIT 1");

if(mysql_num_rows($select) > 0) {
  $file = mysql_fetch_assoc($select);

  header("Content-Type: $file[mimetype]");
  readfile($uploaddir.$file[name]);
}

目前,因为它是从 php 文件生成的,所以图像没有被缓存,这确实降低了网站的速度。所以我添加了这个:

header("Cache-Control: private, max-age=10800, pre-check=10800");
header("Pragma: private");
header("Expires: " . date(DATE_RFC822,strtotime(" 2 day")));

这解决了问题,太好了!现在图像已缓存,加载速度非常快。

但是,用户可以更改他们的个人资料图片。发生这种情况时,我保存他们上传的图片,删除旧图片,并更新数据库条目以指向新图片。但是现在,由于旧图片仍在缓存中,除非他们手动 F5 页面,否则他们看不到更新。

我怎样才能让它缓存图片,但在图片被更改时强制“重新缓存”?

【问题讨论】:

  • 与您的问题相切,但 PHP mysql 扩展已被 mysqli 和 PDO_MySQL 取代。如果可以,您应该替换该代码。 ca3.php.net/manual/en/intro.mysql.php
  • 天啊。不敢相信我在开始这个项目时错过了这一点

标签: php caching cache-control


【解决方案1】:

在他们更新图片后,在你访问的url中添加一个额外的参数来显示图片,这里是`displayimage.php'。 最常见的是时间戳。

与正常情况一样,您将访问displayimage.php?id=123123

更新个人资料图片后,要刷新图像,您需要访问 displayimage.php?id=123123&time=1000121110。 每次用户更新图像时,更改时间参数将强制从页面重新加载图像。

【讨论】:

    【解决方案2】:

    目前您的脚本网址如下所示:

    displayimage.php?id=X
    

    您需要为每个用户添加一个版本号,每次用户更新他的个人资料图片时,该版本号都会增加:

    displayimage.php?id=X&v=Y
    

    版本号也可以存储在数据库中。

    版本号也可以是上传图片文件的最后修改时间,避免使用另一个表字段和递增代码:

    displayimage.php?id=X&v=TIME
    

    【讨论】:

      猜你喜欢
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多