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

标签 php mysql laravel

我有一个上传和存储文件的 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/

相关文章:

PHP/Ratchet websocket - while 循环的问题

mysql - 我可以在 mysql 中使用带有 WHERE 子句的 REPLACE 吗?

mysql - 匹配反对和左连接显示错误

php - 如果关系不存在,则为默认值

php - 方法 'loadFactoriesFrom' 已弃用

mysql - 从 SQL View 创建 Laravel 模型

php - 如何阻止电子邮件客户端自动访问电子邮件中的链接?

php - 如何动态添加到PHPExcel电子表格

php - 动态 PHP PDO MYSQL 查询不更新 [未返回错误]

mysql - 聚合函数如何影响与其一起查询的列?