在PHP生成动态图片缓存

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

很抱歉现在才说,但我是个彻头彻尾的新手,有很多你告诉我的东西我都不明白。谢谢你提供的信息,我希望现在谷歌能解决问题了。 我也使用的是nginx而不是apache,所以.htaccess是行不通的,或者我错了吗? - Madi
从大多数答案来看,我认为您想扩展有关在用户信息更改时重新创建图像的部分。您的问题被误解为仅涉及简单的图像缓存机制。 - Basti
所以我决定只有在上次创建后24小时过去后才重新创建图像。感谢所有用户的帮助! - Madi
然后,您应该为任何您发现有帮助的答案投票,并接受您认为最正确的答案。这就是我们在SO上互相感谢的方式 :) - vascowhite
很抱歉,我还没有足够的声望 :P 但是我已经检查了一个答案。 - Madi
5个回答

6

将图片缓存到磁盘上,让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作业将它们移动。


3

缓存图片可能是最容易解决的缓存问题,只需在生成图像后保存本地副本到您的服务器上,并在运行生成代码之前检查本地副本。

类似于以下内容:

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

这只是伪代码,但你应该很容易将其翻译成PHP。


引用 OP 的话:“如何对图像进行缓存,并且只有在脚本输出的信息更改时才重新运行脚本?”用户的信息会随着时间而改变,因此这些图像将需要重新创建。 - Basti
@Basti 哦,没错,已经编辑了。在你的解决方案中,使用哈希作为文件名会起作用吗? - vascowhite
可能是的。但是如果没有先解析用户资料,你就无法将用户名与其图像相关联了。 - Basti

2

设置PHP头文件以通知浏览器资源已被缓存:

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

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/


你好,请问能否更新一下你的链接?你之前发布的那个已经失效了。 - Lorenz Meyer
@LorenzMeyer 已更新。 - Milap

1

每次请求时,您需要重新解析用户的个人资料以查找是否有更改。

然后,您可以将所有信息放入某种哈希中,例如md5($name.$location),并将此信息存储在任何位置。如果现在收到图像请求,请解析用户的个人资料,再次创建哈希并查找该哈希。如果已经存储了它,您之前已经创建了图像,只需输出即可。如果哈希不同,则用户的信息也已更改,因此您需要重新创建图像。

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


这是一个相当不错的想法,将图像存储24小时(例如),并在时间到期时更新它们。我认为我会选择这种方式,对我来说实时更改并不那么重要。谢谢! - Madi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接