管理大量文件的提示?

时间:2009-03-22 16:38:05

标签: php directory-structure file-management

关于文件管理和存储在大型项目中,有一些非常好的问题。

  

Storing Images in DB - Yea or Nay?
  Would you store binary data in database or in file system?

第一个有一些很好的见解,在我的项目中,我决定采用文件路径,而不是数据库路径。

反对使用文件系统的一个主要问题是备份。但是在我们的系统中,我们有一个很棒的备份方案,所以我并不担心。

下一个路径是如何存储实际文件。我一直在考虑让文件的位置始终保持静态,并在数据库方面创建一个虚拟目录系统。因此,文件的链接不会改变。

我正在构建的系统将具有一个全局文件管理,因此所有用户都可以访问所有文件。但许多已经走过文件路径的人谈论物理目录大小(例如,如果所有文件都在一个目录中)

所以我的问题是,为这些静态文件创建文件夹时有哪些提示或最佳实践方法,或者我根本不应该进入虚拟目录路径。

(项目在LAMP堆栈(PHP)上,如果它有帮助的话)

6 个答案:

答案 0 :(得分:12)

一种方法是为每个文件分配一个唯一的编号,并使用它来查找实际的文件位置。然后,您使用该数字在文件系统中的不同目录中分发文件。例如,您可以使用类似此方案的内容:

/images/{0}/{1}/{2}

  

{0}: file_number % 100
  {1}: (file_number / 100) % 100
  {2}: file_number

答案 1 :(得分:9)

前段时间我遇到了一个托管大量文件的网站。我们所做的是采用GUID(也是文件的主键字段)(例如BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301)并存储如下文件:/ B / C / C / BCC46E3F-2F7A-42b1 -92CE-DBD6EC6D6301 / filename.ext

这有一定的优势:

  • 您可以在多个服务器上扩展文件服务器(并为每个服务器分配特定目录)
  • 您不必重命名文件
  • 您的目录保证是唯一的

希望这有帮助!

答案 2 :(得分:6)

为了避免在单个目录中创建过多的条目,您可能希望基于文件名的片段创建目录。因此,例如,如果您有一个名为d7f5ae9​​b7c5a.png的文件,您可能希望将其存储在media / d7 / f5 / d7f5ae9​​b7c5a.png中。如果您的文件名都是十六进制的,那么这会将单个目录中的条目数限制为256,直到达到最终级别。

答案 3 :(得分:2)

  1. 一个用户图像~100kb,所以让数据库中有10 000个用户,每个用户平均有5个图像,所以我们将有5 TB的数据库,每个图像输出将通过DB执行额外的数据库流量将降低一般数据库服务器的性能。 ...您可以使用数据库集群来避免这种情况,但假设它很昂贵

  2. 有关实时数据库错误的用户报告,(在测试中 - 一切正常),如何在开发人员机器上创建转储解压缩?需要多长时间?

  3. 您可以决定将图像放在某个CDN上,源代码中的更改会是什么?

答案 4 :(得分:1)

我通常采用这种方法:

为应用程序指定一个全局设置变量,指向存储上载文件的文件夹。在数据库中存储文件的相对路径(相对于设置变量指向的路径)。

因此,如果文件位于/www/uploads/image.jpg,您的设置变量指向/ www / uploads您的数据库行有image.jpg。这是一种灵活的方法,可以将系统目录结构与应用程序分离。

此外,您可以根据与这些数据库相关的数据库表将目录中的文件存储分段。假设您有一个表user_reports和一个表user_photos。您可以在/ www / uploads / user_reports中存储与user_reports相关的文件。如果您有大量用户上传,则可以进一步实现分段。假设用户在20.03.2009上传文件,该文件名为report.pdf,因此您将其存储在/www/uploads/user_reports/2009/03/20/report.pdf。

答案 5 :(得分:1)

我不能说apache和PHP如何管理文件,但我可以说一下ext3文件系统。 ext3似乎没有同一目录中的大量文件的问题。我用多达一百万个文件对它进行了测试。在创建目录之前,请确保在文件系统上启用了dir_index选项。您可以通过运行dump2fs进行检查,并通过运行tune2fs来更改此选项。将文件散列到子目录树中仍然很有用,因为命令行工具仍然可能在列出目录内容时遇到问题。