将图片缓存到磁盘上,让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作业将它们移动。
缓存图片可能是最容易解决的缓存问题,只需在生成图像后保存本地副本到您的服务器上,并在运行生成代码之前检查本地副本。
类似于以下内容:
if(file_exists(image12345.png && !checkIfDataChanged()){
serve cached file;
} else {
generate new file;
save new file to image12345.png;
serve cached file;
}
这只是伪代码,但你应该很容易将其翻译成PHP。
设置PHP头文件以通知浏览器资源已被缓存:
header("Last-Modified: " . date("D, d M Y H:i:s", getlastmod()));
在这里,您可以找到如何使用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/
每次请求时,您需要重新解析用户的个人资料以查找是否有更改。
然后,您可以将所有信息放入某种哈希中,例如md5($name.$location)
,并将此信息存储在任何位置。如果现在收到图像请求,请解析用户的个人资料,再次创建哈希并查找该哈希。如果已经存储了它,您之前已经创建了图像,只需输出即可。如果哈希不同,则用户的信息也已更改,因此您需要重新创建图像。
您还可以应用一些启发式方法,例如用户可能只会每小时更改一次个人资料,甚至只更改一次每天。基于这种假设,您可以比较用户图像的创建日期,并且仅在图像早于一小时(或一天)时解析用户的信息。