智能地将数百万个文件存储在基于日期的文件夹中

时间:2014-11-02 05:23:22

标签: php mysql laravel

我有一个上传和存储文件的PHP应用程序(想想Imgur)。它现在的工作方式是所有文件都进入一个主/storage目录。这一切都很好,除非你想在该目录中做一些事情,一个简单的ls通常会崩溃我的终端。除了rsync需要一段时间来构建文件列表之外,这还不是问题,但我想为未来做好计划。

将上传存储在/year/month/file.ext目录中还是使用可扩展的单个目录会更智能吗?这样做的一个问题是,已经存在数百万个直接链接到site.com/storage/file.ext的链接,这些链接需要重定向到新位置 - 这样做的正确方法是什么,而不是在每次图像都没有锤击mysql请求?

2 个答案:

答案 0 :(得分:4)

处理大量文件的常用方法是将它们分解为子目录,正如您所推测的那样。而是按日期划分它们,这需要知道有关文件的一些元数据,然后按文件名分解它们。

例如,如果文件名为abcdefg.jpg,则将其存储为路径/storage/a/b/c/abcdefg.jpg。子目录的确切数量取决于您希望扩展多少。

在顶层,创建26个子目录a-z。在此之下,每个子目录中还有26个。在下面,每个子子目录中有26个。您可以让脚本为您执行此操作。

然后将每个图像移动到相应的子子目录中。提取每个文件名的前三个字符并构建完整的路径。同样,程序可以为您完成此操作。如果您希望在执行此操作时保持站点的正常运行,请使用硬链接(假设类似Unix的系统)并在迁移完成后删除原始文件。

最后,要将旧链接映射到新位置,请使用Apache2的mod_rewrite(假设您正在使用该服务器)。实际上,您永远不必公开链接中文件的实际路径;让mod_rewrite为你做的工作。

RewriteRule ^/storage/(([a-z])([a-z])([a-z]).*)$ /storage/$2/$3/$4/$1

答案 1 :(得分:0)

形成更具体的组织模式听起来很明智......它至少可以更轻松地管理大量的图像文件,并可能为批量备份和其他操作脚本打开一扇门。

您是否可以编写一个以编程方式运行并找到对文件的引用的迁移脚本,并用新路径替换它们?或者目前是否存在大量外部(在您的控制之外)对您的文件的引用?

您也可以以编程方式为您的Web服务器生成重定向映射,以便将旧路径的请求发送到新路径。