Php 文件主机的目录结构

Php 文件主机的目录结构,php,linux,filesystems,Php,Linux,Filesystems,我有一个简单的文件主机,它给文件一个唯一的id,并将它们存储在一个目录中。有人告诉我,这将在未来造成问题,我想知道我应该注意什么,以确保它在未来和以后顺利运行 另外,通过发送头信息和readfile()强制下载是否存在性能问题?如果不使用脚本,保留文件名并允许直接下载会更好吗 谢谢我认为我建议使用一些脚本来控制滥用。我还建议保留文件名,除非脚本将在数据库上创建与其原始状态相关的索引。你也可以尝试在脚本中加入一些重写魔法,这样就可以通过不暴露真实姓名(你的唯一id)来增加另一层安全性给最终用户。告

我有一个简单的文件主机,它给文件一个唯一的id,并将它们存储在一个目录中。有人告诉我,这将在未来造成问题,我想知道我应该注意什么,以确保它在未来和以后顺利运行

另外,通过发送头信息和readfile()强制下载是否存在性能问题?如果不使用脚本,保留文件名并允许直接下载会更好吗


谢谢

我认为我建议使用一些脚本来控制滥用。我还建议保留文件名,除非脚本将在数据库上创建与其原始状态相关的索引。你也可以尝试在脚本中加入一些重写魔法,这样就可以通过不暴露真实姓名(你的唯一id)来增加另一层安全性给最终用户。

告诉您的这类问题很可能与在同一目录中堆积成千上万个文件对性能的影响有关

要避免这种情况,请不要将文件直接存储在一个目录下,而是尝试将它们分散在子目录下

为了实现这一点,请查看您要存储的文件的ID(比如19873),并将其存储在
/73/98/19873
下,其中73是
ID%100
,98是
(ID/100)%100

以上保证在
下最多有100个子目录,在
/*
下最多有100个子目录。这将大大减少叶子上每个目录的文件数

两个级别的子目录足够典型,并且在不浪费太多时间将目录名或文件名解析为索引节点(在同一个目录中有太多文件名需要查看时会发生什么情况-尽管像
ext3
这样的现代文件系统在这里非常有效)之间取得了很好的平衡和深度(当您必须深入20个子目录查找文件时会发生什么情况)。您也可以选择使用较大或较小的值(10,1000)而不是100。模为100的两个级别对于100k到5M之间的文件是理想的


在给定需要检索的文件ID的情况下,使用相同的技术计算文件系统上文件的完整路径。

您的第一个问题实际上取决于您使用的文件系统类型。我假设在回答时ext3没有任何日志优化

首先,是的,当文件数超过系统ARG_MAX时,一个位置的多个文件可能会导致问题。换句话说,rm-rf*会在抱怨参数太多时退出。您可能会考虑使用A/Z-Z分区,并根据其唯一名称中最左边字节的值适当地停放文件。

另外,尽量避免在短时间内打开所有这些文件的进程。。。像“updatedb”这样的cron一旦你真的开始填充就会引起问题。同样,尝试将这些目录排除在“find”等命令的范围之外

这导致了另一个潜在的问题,缓冲区。访问这些文件的频率如何?如果给定目录中有300个文件,是否每30分钟至少访问一次?如果是这样,您可能希望打开/proc/sys/vfs_cache_pressure设置,这样Linux将回收更多内存并使其可用于PHP/Apache/Etc


最后,关于readfile。。。我建议只使用直接下载链接。这避免了PHP在下载过程中必须保持活动状态

如果您可能有数千个文件,那么应该将它们分布在多个子目录中

我建议保留原始文件名,尽管您可能需要修改它以保证唯一性。这有助于您诊断问题

另外,通过发送头信息和readfile()强制下载是否存在性能问题

是的,如果你做得很幼稚的话。一个好的文件下载脚本应该:

  • 流式处理长文件以避免占用内存
  • 支持ETag和上次修改的请求/响应头,以确保缓存继续工作
  • 提出合理的过期/缓存控制设置
它仍然不会像web服务器那样快(它通常是用C编写的,并针对文件服务进行了大量优化,甚至可能使用OS内核功能),但会更好

如果不使用脚本,保留文件名并允许直接下载会更好吗

是的,它的性能会更好,但获得正确的担保是一项挑战。有关讨论,请参阅

一种折衷方法是使用重写,使URL看起来像:

hxxp://www.example.com/files/1234/Lovely_long_filename_that_can_contain_any_Unicode_character.zip
但它在内部被重定向到:

hxxp://www.example.com/realfiles/1234.dat
并由web服务器(快速)提供服务