Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 一个目录中有多个文件?_Php_Linux_Filesystems - Fatal编程技术网

Php 一个目录中有多个文件?

Php 一个目录中有多个文件?,php,linux,filesystems,Php,Linux,Filesystems,我在Linux平台上开发了一些PHP项目。将数千个图像(文件)放在一个目录中有什么缺点吗?这是一个封闭集,不会增长。另一种方法是使用基于某个ID的目录结构来分隔这些文件(这样,一个目录中只有100个) 我问这个问题,因为当我看不同网站上的图片和URL时,我经常看到这样的分离。您可以看到,目录分离是以这样的方式完成的,即一个目录中不超过数百个图像 如果我不把几千个文件(不是不断增长的文件集)放在一个目录中,而是把它们分成一组,例如100个,我会得到什么?把事情复杂化值得吗 更新: 不会对目录中的

我在Linux平台上开发了一些PHP项目。将数千个图像(文件)放在一个目录中有什么缺点吗?这是一个封闭集,不会增长。另一种方法是使用基于某个ID的目录结构来分隔这些文件(这样,一个目录中只有100个)

我问这个问题,因为当我看不同网站上的图片和URL时,我经常看到这样的分离。您可以看到,目录分离是以这样的方式完成的,即一个目录中不超过数百个图像

如果我不把几千个文件(不是不断增长的文件集)放在一个目录中,而是把它们分成一组,例如100个,我会得到什么?把事情复杂化值得吗

更新:

  • 不会对目录中的文件进行任何编程迭代(只是通过文件名直接访问图像)
  • 我想强调的是,图像集是关闭的。少于5000张图片,就是这样
  • 此图像没有逻辑分类
  • 不需要人工访问/浏览
  • 图像具有唯一的文件名
  • 操作系统:Debian/Linux 2.6.26-2-686,文件系统:ext3
答案中有价值的信息:

为什么要将许多文件分隔到不同的目录:

  • “通过nfs使用ext3时每个目录限制32k文件”
  • 性能原因(访问速度)[但对于几千个文件,如果不进行测量,很难说它是否值得]

我能想象到它在哪里有害的唯一原因是在目录上迭代时。更多的文件意味着更多的迭代。但从编程的角度来看,这基本上就是我所能想到的。

我认为这个问题有两个方面:

  • 您正在使用的Linux文件系统是否有效地支持包含数千个文件的目录。我不是专家,但我认为更新的文件系统不会有问题

  • 特定PHP函数是否存在性能问题?我认为直接访问文件应该是可以的,但如果你在做目录列表,那么你最终可能会遇到时间或内存问题


  • 除了通过将图像分割成子目录来加快文件访问速度之外,您还可以在达到文件系统的自然限制之前显著地扩展可跟踪的文件数量


    一种简单的方法是
    md5()
    文件名,然后使用前n个字符作为目录名(例如,
    substr(md5($filename),2)
    )。这确保了合理的均匀分布(相对于直接文件名的前n个字符)。

    数千张图像仍然可以。当您访问目录时,操作系统将按4K块读取其文件列表。如果您有普通目录结构,如果其中有许多(例如十万)文件,则可能需要花费时间来读取整个文件列表。

    如果您不希望出现任何文件名冲突,并且不需要在任何时候迭代这些图像,则没有理由将这些文件拆分为多个目录


    但是,如果你能想到一个建议性的分类,对图像进行一点排序也不是一个坏主意,即使只是出于维护原因。

    如果可以选择更改文件系统,我建议将所有图像存储到ReiserFS文件系统的任何位置。它非常适合快速存储/访问大量小文件


    如果不是这样,则MightyE将其拆分为文件夹的响应是最符合逻辑的,并且将大大增加访问时间。

    通常拆分的原因是文件系统性能。 对于一个封闭的5000个文件集,我不确定是否值得这么麻烦。 我建议您尝试将所有文件放在一个目录中的简单方法,但请注意访问文件所需的实际时间

    如果你发现它不够快,不能满足你的需要,你可以按照你的建议进行分割

    出于性能原因,我不得不自己分割文件。 此外,在nfs上使用ext3时,我遇到了每个目录32k文件的限制(不确定这是nfs还是ext3的限制)。 所以这是另一个分裂成多个目录的原因。
    在任何情况下,都可以尝试使用单个目录,并且只有当您发现它不够快时才进行拆分。

    多个级别对于进一步的子目录级别非常有用。例如:./12/34/56/78/1234567890abc.jpg.Ok,因此md5将是一种通用方法。在我的例子中,我已经有了唯一的ID,因为每个图像都只与一个数据库行关联(当然,它有它的主行)。我认为这是一个典型的情况。值得考虑的是,这些数字可能不像md5哈希那样均匀分布。谢谢你的回答(也谢谢你提出这样的问题)。这对我很有帮助。我在一个目录中生成html缓存,但最后有这么多文件。因此,我使用
    substr(md5($filename),2)
    在目录上拆分生成,现在它像一个符咒一样运行。
    (不确定它是nfs限制还是ext3限制)
    它是ext3限制。