【问题标题】:How do you Store Millions of Images on your Server? [duplicate]您如何在服务器上存储数百万张图像? [复制]
【发布时间】:2011-03-17 18:05:04
【问题描述】:

可能重复:
Storing a large number of images

你好,

我希望能够使用 PHP 在我的 LAMP 服务器上扩展到数百万个用户个人资料图片。

我目前将所有图像存储在一个文件夹中,这是一个很大的禁忌,因此我想将它们分散到许多文件夹和子文件夹中(例如 aa/bb/ 等...)。

最好和最有效的方法是什么,特别是如果我不想调用数据库来获取该用户的个人资料图片的文件名/路径?

我正在考虑可能对用户名进行哈希处理并利用该哈希的前 4 个字母来生成/定位该用户的个人资料图片的路径,这样我就不必从数据库中额外访问任何内容因为我将永远拥有用户的用户名。因此,例如,如果用户用户名哈希的前 4 个字符是“aabb”,我会将该用户的个人资料图片存储在 aa/bb/username/profile.jpg 下,理论上这应该允许我扩展到数百万用户而无需必须向数据库添加任何内容,同时将所有图片均匀分布在 aa/bb/ 文件夹结构中。

有什么想法/意见吗?

谢谢!

【问题讨论】:

  • 这可能会导致同名的图像被放在一个文件夹中,即新图像可能会替换旧图像。

标签: php file filesystems lamp


【解决方案1】:

取决于您的用户的组织方式。

  1. 我猜他们都有一个唯一的 ID。如果您知道,您可以存储 0xx/007.png8xx/824.png547xx/54723.png 等文件。这将主文件夹中的项目数量减少了 100 倍,每个文件夹最多包含 100 个项目。

  2. 如果您只允许在用户名中选择字符,则可以直接使用它,但我通常不建议这样做。如果你不知道自己在做什么,它可能会变得很危险。 ma/master_of_desaster.pngki/king_cool.pngso/some_other_infantile_name.png 等文件名

  3. 使用哈希是个好主意。如果它与安全性无关(似乎不是),您可以通过使用短校验和算法而不是复杂但安全的哈希算法来减少 CPU 开销。想想CRC32。 [CRC32sum]/[USER_ID].png等文件名

【讨论】:

  • 感谢您的快速回复,晕。用户名绝对是唯一的,我还为每个用户分配了一个唯一的数字用户 ID,我也可以使用它。考虑到这一点,您会在 #1 和 #3 之间建议哪种选择?另外,关于#3,您会在 PHP 中建议哪种“短校验和算法”?我原本打算简单地使用 md5,但 CPU 开销绝对是一个问题,尤其是当我提供数百万张图像并且每个图像都必须经过相同的哈希过程才能检索时。再次感谢!
  • md5 用户名,然后根据 md5 的前几个字符创建或检查(如果存在)目录,然后将对图像的引用保存在数据库中
  • 解决方案 #1 速度更快,可以轻松使用 2 或 3 次迭代,以将每个文件夹的项目数减少 10,000 或 1,000,000。此外,您可以在每个文件夹级别跳过 3 或 4 位数字。对于解决方案#3 CRC32 是我想到的最好的。见php.net/manual/en/function.crc32.php
  • 另外请记住,用户可能能够更改他们的名字(如果将来还不能)。因此,根据 ID 选择算法是个好主意。
  • 我正试图用这种新的方式来思考这个问题。如果我按照您的示例(10000xx)对它们进行分组,那么图像文件夹中将有数千个子文件夹。因此,我正在尝试将其分解为多个子文件夹的最佳方法。像 0xx/0xx/1.png 和 10xx/0xx/1000000.png 之类的东西,但是如果文件夹中没有太多文件或子文件夹,我很难想出最好的方法。有什么建议?感谢您的宝贵时间,我很感激。
猜你喜欢
  • 1970-01-01
  • 2019-10-06
  • 2013-04-11
  • 2013-08-29
  • 1970-01-01
  • 2011-02-03
  • 2012-01-21
  • 1970-01-01
  • 2021-06-11
相关资源
最近更新 更多