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

Php 智能地将数百万个文件存储在基于日期的文件夹中,php,mysql,laravel,Php,Mysql,Laravel,我有一个上传和存储文件的PHP应用程序(想想Imgur)。它现在的工作方式是将所有文件放入一个主/storage目录。这一切都很好,当然,除非您想在该目录中执行某些操作,否则一个简单的ls通常会使我的终端崩溃。除了rsync花了一段时间构建一个文件列表之外,这还不是一个问题,但我想为未来做计划 将上传内容存储在/year/month/file.ext目录中会更明智吗?还是使用一个可扩展的目录?这样做的一个问题是,已经有数以百万计的链接直接链接到site.com/storage/file.ext,

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


将上传内容存储在
/year/month/file.ext
目录中会更明智吗?还是使用一个可扩展的目录?这样做的一个问题是,已经有数以百万计的链接直接链接到
site.com/storage/file.ext
,需要重定向到新的位置-在每次请求图像时不敲打mysql的情况下,正确的做法是什么?

处理大量文件的常见方法是如您所猜测的,将它们拆分为子目录。而是按日期划分,这需要知道一些关于文件的元数据,按文件名划分

例如,如果文件名为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

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

例如,如果文件名为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

形成更具体的组织模式听起来很明智。。它至少使管理大量图像文件变得更容易,并可能为批量备份和其他操作脚本打开一些大门

您是否可以编写一个迁移脚本,以编程方式遍历并查找对文件的引用,并用新路径替换它们?或者当前是否有大量外部(您无法控制)引用您的文件


您还可以通过编程为web服务器生成重定向映射,将旧路径的请求发送到新路径。

形成更具体的组织模式听起来很明智。。它至少使管理大量图像文件变得更容易,并可能为批量备份和其他操作脚本打开一些大门

您是否可以编写一个迁移脚本,以编程方式遍历并查找对文件的引用,并用新路径替换它们?或者当前是否有大量外部(您无法控制)引用您的文件


您还可以通过编程为web服务器生成重定向映射,将旧路径的请求发送到新路径。

相关答案关于列出文件过多的目录时出现崩溃或速度过慢:相关答案关于列出目录时出现崩溃或速度过慢文件太多:引用超出我的控制范围。我喜欢Barry使用文件名创建路径的想法,这在Apache或Nginx中非常简单。如果文件名中有足够的信息来准确创建重定向,这是最好的选择。引用超出了我的控制范围。我喜欢Barry使用文件名创建路径的想法,这在Apache或Nginx中非常简单。如果文件名中有足够的信息来准确创建重定向,这是最好的选择。