1

我正在开发一个 PHP Web 应用程序,我必须在我的数据库上引入一个缓存层。

专门用于将图像存储在从数据库中获取的缓存层中,图像大小很大:4-8 MP。最好的方法是什么?我应该使用哪些数据源?

4

3 回答 3

2

这是一个方案的建议:

创建三个文件夹 - 缩略图、显示图像和原始图像。在这些文件中,您将存储缩略图的缓存版本、为 Web 显示调整大小的版本以及您的原始图像。

上传图像时,在您的文件系统中为其分配一个唯一名称并将其存储在那里。将原始名称和唯一名称以及任何其他相关信息存储在数据库中。

假设您有某种图像浏览器可以从这些图像中进行选择...

从数据库中检索图像数据。使用它来定位缩略图、显示版本或原件。

浏览图像时,查找现有缩略图。如果你有,请发送。如果不这样做,请创建一个,将其存储在缩略图文件夹中,然后发送。

当放大图像以在浏览器中显示时,请检查显示版本等是否为缩略图。使用调整大小的版本进行显示,因为 4-8Mp 仅用于 Web 浏览器就需要发送大量数据。

选择下载图像时,请发送原始图像。

在这一切中,您需要小心缓存控制 - PHP 输出不会自动缓存,因此您需要自己添加标头。正确地执行此操作可以显着加快您的应用程序。

如果这是合理的,您可以使用它来添加子文件夹,调整缓存的调整大小图像的大小等。

祝你好运!

于 2013-06-21T04:53:33.913 回答
0

首先,正如每个人所建议的那样,将图像存储在数据库中并不是一个好主意......我认为这里的“缓存层”意味着如果文件系统中已经存在图像,则不要向数据库发起查询......如果是这样的话。 ..

将您使用脚本创建的所有最终图像保存在一个目录中。然后使用重写规则来提供图像(如果存在),否则将创建传递给 PHP。

更多解释..

http://www.sitepoint.com/forums/showthread.php?719010-PHP-image-caching-in-server

于 2013-06-21T04:46:51.273 回答
0

首先为您的缓存指定一个目录......这应该可以由网络服务器写入。

然后将您的请求参数映射到该目录中的文件名。

$filename = $_GET["id"]."_".$_GET["width"].".jpg";

然后你基本上会遵循这个模式。

if (!file_exists($cache_dir.$filename)){
     // do your db query get the image and resize it to the width and then
     // save it to $cache_dir.$filename
}

header("Content-Type: image/jpeg");
header("Content-Size: ".filesize($cache_dir.$filename));
readfile($cache_dir.$filename);

您可能还需要添加检查以查看缓存记录是否已过期(时间与修改时间)以及 file_exists 检查。

要从缓存中手动刷新某些内容,您只需从缓存目录中删除文件,它们就会重新生成,您可能希望在使用新文件更新数据库记录时执行此操作以使缓存保持最新。

于 2013-06-21T04:58:10.520 回答