我的php脚本解析其他网站上用户的个人资料,获取一些信息,并为特定用户生成.png图像(script.php?username=)。每次加载包含这些图像的页面时,脚本都会一次又一次地运行。如果脚本输出的信息发生更改,我如何缓存图像并仅再次运行脚本?这将节省相当多的资源。
将映像缓存到磁盘,并让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)
的散列中,并将这些信息存储在任何位置。如果您现在收到一个图像请求,请解析用户的配置文件,再次创建哈希并查找此哈希。如果你已经存储了它,那么你之前创建了图像,可以直接输出。如果哈希不同,那么用户的信息也发生了变化,你必须重新创建图像。
您还可以应用一些启发式方法,比如用户可能每小时只更改一次个人资料,甚至每天只更改一次等。通过这种假设,您可以比较用户图像的创建日期,并且只有在图像超过一小时(或一天)时才解析用户信息。