缓存php上生成的动态图像


Caching dynamic image generated on php

我的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)的散列中,并将这些信息存储在任何位置。如果您现在收到一个图像请求,请解析用户的配置文件,再次创建哈希并查找此哈希。如果你已经存储了它,那么你之前创建了图像,可以直接输出。如果哈希不同,那么用户的信息也发生了变化,你必须重新创建图像。

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