【问题标题】:Caching dynamic image generated on php缓存php生成的动态图片
【发布时间】:2012-03-13 20:21:17
【问题描述】:

我的 php 脚本解析用户在其他站点上的个人资料,获取一些信息并为某些用户生成 .png 图像(script.php?username=)。每次加载包含这些图像的页面时,脚本都会一次又一次地运行。 如果输出的信息发生更改,如何缓存图像并仅再次运行脚本?这将节省相当多的资源。

【问题讨论】:

  • 很抱歉现在这么说,但我完全是个菜鸟,你告诉我的很多事情我都听不懂。不过感谢您提供的信息,我希望谷歌现在会这样做。我也有 nginx 而不是 apache,所以 .htaccess 不起作用,还是我错了?
  • 从大部分答案来看,我认为如果用户的信息发生了变化,你想扩展关于重新创建图像的部分。您的问题被误解为仅指简单的图像缓存机制。
  • 所以我决定仅在上次创建后 24 小时后重新创建图像。感谢所有用户的帮助!
  • 那么您应该对任何您认为有帮助的答案进行投票,并接受您认为最适合您的答案。这就是我们在 SO 上相互感谢的方式 :)
  • 我很高兴,但我还没有足够的代表:P 虽然检查了一个答案。

标签: php


【解决方案1】:

将图像缓存到磁盘,让 Apache 处理其余的工作。

首先,重做您的图像 URI,使其类似于:

<img src="/images/profiles/johnsmith.png" />

然后,在/images/profiles/ 中,放置一个.htaccess 文件:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.png$ /script.php?username=$1 [QSA,L]
</IfModule>

然后让您的脚本将生成的 png 写入磁盘,然后再将其提供给用户。下次请求图片时,会直接从网络服务器获取。

当用户的个人资料信息发生变化时,只需从服务器中删除现有的 .png 文件,您的脚本就会在下次请求图像时运行。

如果您不希望 Web 服务器能够在 Web 根目录内写入,请在其外部写入并让 cron 作业移动它们。

【讨论】:

    【解决方案2】:

    缓存图像可能是最容易解决的缓存问题,因为它只是在生成任何图像后将其本地副本保存到服务器并在运行生成它的代码之前检查本地副本。

    类似:-

    if(file_exists(image12345.png && !checkIfDataChanged()){
        serve cached file;
    } else {
        generate new file;
        save new file to image12345.png;
        serve cached file;
    }
    

    当然是这个伪代码,但是应该很容易将它翻译成 PHP。

    【讨论】:

    • 引用 OP How can I cache images and only run script again if information it outputs was changed?。用户的信息会随着时间而改变,因此必须重新创建图像。
    • @Basti 哦,是的,已编辑。在您的解决方案中,使用哈希作为文件名是否可行?
    • 可能是的。但是如果不先解析他的个人资料,您就无法再将用户名与其图像相关联。
    【解决方案3】:

    设置 php 标头以通知浏览器资源已缓存:

    header("Last-Modified: " . date("D, d M Y H:i:s", getlastmod()));
    

    【讨论】:

      【解决方案4】:

      在这里,您可以找到如何使用 php 缓存图像。 当您从数据库中找到更新时,您可以调用这些脚本,否则每次图像都会从缓存中加载。

      // put this above any php image generation code:
      session_start(); 
      header("Cache-Control: private, max-age=10800, pre-check=10800");
      header("Pragma: private");
      header("Expires: " . date(DATE_RFC822,strtotime(" 2 day")));
      

      https://dtbaker.net/blog/web-development/2009/06/how-to-cache-images-generated-by-php/

      【讨论】:

      • 您好,可以更新一下您的链接吗?你发布的那个现在已经死了。
      • @LorenzMeyer 已更新。
      【解决方案5】:

      您需要在每次请求时再次解析用户的个人资料,以了解是否发生了变化。

      然后,您可以将所有信息放入某种散列中,例如md5($name.$location),并将这些信息存储在任何地方。如果您现在收到对图像的请求,请解析用户的个人资料,再次创建散列并查找此散列。如果您已存储它,则您之前创建了图像并且可以将其输出。如果哈希值不同,则用户的信息也发生了变化,您将不得不重新创建图像。

      您还可以应用一些启发式方法,例如用户可能每小时只更改一次个人资料,甚至一天只更改一次。有了这个假设,您可以比较用户图像的创建日期,并且仅在图像超过一个小时(或一天)时才解析用户的信息。

      【讨论】:

      • 将图像存储 24 小时(例如)并在时间到期时更新它们是个好主意。我想我会走这条路,对我来说实时变化并不那么重要。谢谢!
      猜你喜欢
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2013-03-19
      相关资源
      最近更新 更多