Php 快速访问文件

Php 快速访问文件,php,linux,Php,Linux,我目前正在构建一个应用程序,它将生成大量图像(数万张图像,可能更多,但至少在不久的将来不会)。我希望能够确定文件是否存在,并通过http将其发送给客户端(我使用的是apache作为我的web服务器) 最好的方法是什么?我考虑将图像分割成几个文件夹,并减少每个目录中的文件数量。例如,假设我决定每个文件名都以abc的小写字母开头。然后我创建了26个目录,当我想查找文件时,我会首先添加目录名。例如,如果我想要一个名为“funnyimage2.jpg”的文件,我将把它保存在名为“f”的目录中。如果需要,

我目前正在构建一个应用程序,它将生成大量图像(数万张图像,可能更多,但至少在不久的将来不会)。我希望能够确定文件是否存在,并通过http将其发送给客户端(我使用的是apache作为我的web服务器)

最好的方法是什么?我考虑将图像分割成几个文件夹,并减少每个目录中的文件数量。例如,假设我决定每个文件名都以abc的小写字母开头。然后我创建了26个目录,当我想查找文件时,我会首先添加目录名。例如,如果我想要一个名为“funnyimage2.jpg”的文件,我将把它保存在名为“f”的目录中。如果需要,我可以向该结构添加层

老实说,我甚至不确定仅仅将所有文件保存在一个目录中是否有好处,因此如果您可以添加一个解释,说明为什么您的解决方案更好,这将非常有用

p、
我的应用程序是用PHP编写的,我打算用它来检查文件是否存在。

您的设置正常。继续这样做

使用散列,如md5或sha1,然后对路径的每个段使用2个字符。如果你深入到4级,你将永远是优秀的:

f4/a7/b4/66/funnyimage.jpg
哦,将所有文件转储到1目录中的速度很慢的一个原因是,大多数文件系统不将文件名存储在B树或类似结构中。它必须经常扫描整个目录才能找到一个文件


散列之所以伟大,是因为它具有非常好的分布。26个目录可能无法剪切它,特别是如果许多图像的文件名为“image0001.jpg”

那么您的路径似乎是正确的。上的另一篇文章似乎证实了你所做的事情是正确的。

我认为linux对一个目录可以包含的文件数量有限制;最好把他们分开

使用您的方法,您可以使用许多不同的文件名获得相同的精确图像。此外,以“t”开头的图像比以“q”开头的图像要多,因此目录仍然会变大。您可能希望将它们存储为MD5-HASH.jpg。这将消除重复,并在36个目录上有更均匀的分布


编辑:与提及类似,您可以使用多级目录结构来保持目录的大小更小

unix文件系统上的目录只是列出文件名和inode包含的实际文件数据的文件。因此,在目录中扫描特定文件名归结为打开文本文件并扫描包含特定文本段的行的等效操作

在某些情况下,打开目录“文件”和扫描文件名的开销将超过使用多个子目录的开销。通常,只有在有成千上万个文件时才会发生这种情况。您应该对系统/服务器进行基准测试,以找到交叉点所在的位置

然后,决定如何将文件名拆分为子目录是一个简单的问题。如果只允许字母数字字符,那么基于前2个字符(1296个可能的子目录)的拆分可能比包含10000个文件的单个目录更有意义


当然,对于您添加的每一个额外级别的拆分,您都会迫使系统打开另一个目录“文件”并扫描您的文件名,因此不要深入拆分。

由于ext3的目标是与早期的ext2向后兼容,因此许多磁盘结构与ext2类似。因此,ext3缺乏最新的功能,例如扩展数据块、inode的动态分配和块子分配。[15]一个目录最多可以有31998个子目录,因为一个inode最多可以有32000个链接。[16]

显然is_file()更快,所以我想我将使用它。。(根据评论)我只是想在这里记下。。。每个人似乎都主张将文件分成多个文件夹(我也这么做…)。不必担心名称冲突有很多好处,但我没有看到任何令人信服的信息表明这是必需的,或者它有助于通过文件名直接访问文件。目录扫描或通配符匹配更快似乎是显而易见的和合乎逻辑的,但对于文件的简单访问。。。没有数据,只有意见。我的想法是,这“应该”是从其他人告诉我的,而不是从任何文档中得到的克里斯,我在几年前就有过这方面的真实生活经验。当时这些机器还不错,但可能磁盘速度更快。在一个有25000个子目录的目录中,有时扫描和打开一个子目录需要几秒钟的时间。今天,这种影响会降低,但它仍然存在。再过几年,我谈论的是2007/2008+1列榴弹,你有没有关于将文件传播到多个文件夹的好处/效用的参考资料?这个问题在我的一个项目中也出现过,我还没有找到令人信服的证据支持或反对将大量文件存储在一个文件夹中。我发现了一些关于NTFS中最大文件大小的模糊引用,以及关于FAT32的文件夹中文件限制的引用,但没有具体内容,也没有关于ext3等的内容,这只是一个非常常见的问题。如果你对某些数字感兴趣,你可以在你自己的环境中轻松地测试它。我知道我可以测试它,但是,如果它存在,确定什么肯定是故意放在适当的位置,并因此被写在某个文档中,这是一种多么笨拙和不准确的方法啊。如果您没有支持您的声明的文档,您可以这么说……相反,通过您自己的测试结果,您可以确定当前服务器的某些情况,而不是关于具有完全不同设置的服务器的过时信息。您正在使用的磁盘-SAS或