缓存在php上生成的动态图像

时间:2012-03-13 20:21:17

标签: php

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

5 个答案:

答案 0 :(得分:5)

将图像缓存到磁盘,让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写入磁盘,然后再将其提供给用户。下次请求图像时,它将直接从Web服务器获取。

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

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

答案 1 :(得分:3)

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

类似的东西: -

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

在这里,您可以找到如何使用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/

答案 4 :(得分:0)

您需要在每次请求时再次解析用户的个人资料,以确定某些内容是否已更改。

然后,您可以将所有信息都放入某种类型的哈希值md5($name.$location)中,并将此信息存储在任何位置。如果您现在获得图像请求,请解析用户的配置文件,再次创建哈希并查看此哈希值。如果您已经存储它,您之前创建了图像并可以输出它。如果哈希值不同,用户的信息也会发生变化,您将不得不重新创建图像。

您还可以应用一些启发式操作,例如用户每小时只能更改一次配置文件,甚至每天只更改一次。通过此假设,您可以比较用户图像的创建日期,并仅在图像超过一小时(或一天)时解析用户的信息。