5

我将有大约 200,000 张图片作为我网站的一部分。每个图像将被存储 3 次:全尺寸、缩略图、更大的缩略图。全尺寸图像约为 50Kb 到 500Kb。

普通技术:VPS 上的 Linux、Apache、MySQL、PHP。

存储这些以通过浏览器快速检索和显示的最佳方式是什么?

我应该将所有内容存储在一个文件夹中吗?我应该将完整尺寸的图像存储在 1 个文件夹中,将缩略图存储在另一个文件夹中吗?我应该将图像存储在 1000 个文件夹中,并保留图像所在文件夹的索引吗?

感谢您的任何建议。阿尔伯特。

4

5 回答 5

3

我会使用拆分目录结构,深度为三到四级,其想法是将所有文件均匀地拆分到多个目录中,主要是为了便于维护和快速访问。

怎么做?有多种选择:

  • 取图像名称的第一个字符
  • 取名称哈希的第一个字符
  • 取自 1970 年以来添加图片之日起的最后秒数
  • 获取数据库中图像 ID 的最后一个字符(如果存在)

假设我们有 IMG8993_full.jpg、IMG8993_thumb.jpg、IMG8993_smallthumb.jpg

然后我们可以有,例如:

/images/I/M/G/8/IMG8993:
IMG8993_full.jpg
IMG8993_thumb.jpg
IMG8993_smallthumb.jpg
于 2008-11-24T21:14:30.933 回答
1

除非您的用户要访问包含图像目录列表的打开文件夹,否则我认为文件夹结构不会显着提高或降低用户的检索速度。正如其他人所说,确保索引已打开。但是,如果我是您,我会考虑编写(或复制和粘贴)动态提供图像的服务,而不是将它们直接存储在您的 Web 文件结构中。研究在 PHP 中使用 LibGD——它应该预装在大多数 LAMP 服务器上。

缺点:

  • 通过服务提供图像将比提供直接链接慢一点
  • 如果您使用后端图像存储,例如数据库,它可能会崩溃并导致您的所有图像暂时不可用

优点:

  • 您将通过将图像动态调整为缩略图来节省存储空间,并使维护更容易
  • 通常,处理器速度比存储空间便宜

使用 URL 重写,你甚至可以将难看的 URL 变成诸如

/imageServer.php?userID=12345imageId=67890&size=full

变成对用户更时尚、更透明的东西:

/jeremyZX/images/myPhoto.jpg
/jeremyZX/images/tn/myPhoto.jpg

这将给出图像的整个目录结构的外观,而它们实际上以您想要的任何后端格式存储。

于 2008-11-24T21:29:22.463 回答
0

无论你做什么,确保在文件系统上启用目录索引(你应该选择一个支持它的文件系统 - 但他们都这样做)

在实践中,比如说 ext3,这不是问题,因为它在较新的系统上默认启用。您可以使用 tune2fs 找出答案(阅读手册)

于 2008-11-24T21:16:22.257 回答
0

使用这些类型的数字,您可能会或可能不会遇到服务器上设置的 inode 限制。这可能会有问题,具体取决于谁控制该框。

一般来说,我会想出一些方案来将它们分成更易于管理的大小。即使ls在这么大的目录上运行也需要很长时间才能对所有目录进行排序和显示。

于 2008-11-24T21:23:58.557 回答
0

取决于您如何索引它们,以及如何检索它们。

没有什么特别反对将它们全部存储在一个文件夹中,但它变得难以管理。如果您按文件名存储它们,并且文件名是合理的正态分布,您可能希望子文件夹由名称的第一个字母等分隔。如果您按添加日期编制索引,您可能希望将它们分开.

据我所知,没有“更快”或“更慢”的方式来存储图像以供浏览器检索。

于 2008-11-24T21:11:03.437 回答