为图像创建缓存层

时间:2013-06-21 04:16:34

标签: php caching

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

具体来说,为了将图像存储在从db中获取的缓存层中,图像的大小很大:4-8 MP。最好的方法是什么?我应该使用哪些数据源?

3 个答案:

答案 0 :(得分:2)

以下是对计划的建议:

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

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

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

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

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

放大图像以便在浏览器中显示时,请检查缩略图的显示版本等。使用调整大小的版本进行显示,因为4-8Mp是为网络浏览器发送的大量数据。

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

在所有这些中你需要小心缓存控制 - PHP输出不会自动缓存,所以你需要自己添加标题。正确地执行此操作可以大大加快您的应用程序。

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

祝你好运!

答案 1 :(得分:0)

首先,每个人都建议在DB中存储图像不是一个好主意...我认为这里的“缓存层”你的意思是如果图像已经存在于文件系统中则不会向数据库发出查询...如果是这样的话案件......

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

更多解释..

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

答案 2 :(得分:0)

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

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

$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检查。

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