我有一个上传和存储文件的 PHP 应用程序(想想 Imgur)。它现在的工作方式是将所有文件放入一个主 /storage
目录中。这一切都很好,当然,除非您想在该目录中执行某些操作,一个简单的 ls
通常会使我的终端崩溃。除了 rsync 需要一段时间来构建文件列表之外,这还不是一个问题,但我想为 future 做计划。
将上传存储在 /year/month/file.ext
目录中还是使用可扩展的单个目录更明智?这样做的一个问题是,已经有数百万个直接链接到 site.com/storage/file.ext
的链接需要重定向到新位置 - 什么是正确的每次请求图像时无需重击 mysql 的方法?
最佳答案
如您所料,处理大量文件的常用方法是将它们分解为子目录。而是按日期将它们分开,这需要了解有关文件的一些元数据,而是按文件名将它们分开。
例如,如果文件名为abcdefg.jpg,则将其存储为路径/storage/a/b/c/abcdefg.jpg。子目录的确切数量取决于您希望对其进行扩展的程度。
在顶层,创建 26 个子目录 a-z。在此之下,每个子目录中还有 26 个。在此之下,每个子目录中有 26 个。您可以让脚本为您执行此操作。
然后将每个图像移动到适当的子目录中。提取每个文件名的前三个字符并从中构建完整路径。同样,一个程序可以为你做这件事。如果您想在执行此操作时保持您的站点可用,请使用硬链接(hard link)(假设是类 Unix 系统)并在迁移完成后删除原始文件。
最后,要将旧链接映射到新位置,请使用 Apache2 的 mod_rewrite(假设您正在使用该服务器)。事实上,您永远不必在链接中公开文件的实际路径;让 mod_rewrite 为您完成工作。
RewriteRule ^/storage/(([a-z])([a-z])([a-z]).*)$ /storage/$2/$3/$4/$1
关于php - 智能地将数百万个文件存储在基于日期的文件夹中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26696326/