Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.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_Subdirectory - Fatal编程技术网

Php 正在检索非常大的目录的信息

Php 正在检索非常大的目录的信息,php,linux,subdirectory,Php,Linux,Subdirectory,我达到了Linux的32000子目录限制。这导致了我的PHP脚本出现问题,我不希望这种情况再次发生 简单的解决方案是让我的PHP脚本在尝试创建另一个子目录之前检查当前子目录数 我看到的所有执行这种检查的想法都涉及到迭代整个目录并计算每个文件夹。考虑到我关心的是非常大的目录,有没有更好的方法来检索它包含的文件/文件夹的数量 附加问题:是否还有一种非迭代的方法来查找目录的磁盘使用情况 提前谢谢! Brian更好的方法是设计目录布局,这样就不可能在一个目录中包含32000个文件。事实上,我认为一个目录

我达到了Linux的32000子目录限制。这导致了我的PHP脚本出现问题,我不希望这种情况再次发生

简单的解决方案是让我的PHP脚本在尝试创建另一个子目录之前检查当前子目录数

我看到的所有执行这种检查的想法都涉及到迭代整个目录并计算每个文件夹。考虑到我关心的是非常大的目录,有没有更好的方法来检索它包含的文件/文件夹的数量

附加问题:是否还有一种非迭代的方法来查找目录的磁盘使用情况

提前谢谢!
Brian

更好的方法是设计目录布局,这样就不可能在一个目录中包含32000个文件。事实上,我认为一个目录中即使1000个文件也太多了

我通常采用的解决这个问题的方法包括额外的目录层次结构。一种典型的方法是将当前存储在单个目录中的文件名拆分为与嵌套目录相对应的部分。所以,如果你有一堆像

xyzzy
foo
bar
blah
实际上,您可以将它们存储为

x/xyzzy
f/foo
b/bar
b/blah
等等。您可以将此方法扩展到多个目录级别,或者使用多个字符分割子目录,以便权衡此方法的深度和广度


可能会有人建议您使用没有32k文件限制的文件系统。就个人而言,即使有这样一个文件系统,我也会一直使用我在这里提出的方案。在包含大量文件的目录中使用命令行工具几乎不可能有效地工作(即使
ls
变得非常笨拙),而且在开发、调试过程中总是需要这种手动探索,通常在正常操作期间,du命令会不时计算文件夹的磁盘使用量。

du命令可能会搜索整个文件夹,但它仍然比PHP中的任何操作都要快。为什么你有32000个子文件夹???我几乎可以肯定你真正的问题是你有32k个文件夹,这个限制是有原因的。哇!我忘了回答这个额外的问题:如果“非迭代方式查找目录的磁盘使用情况”指的是一种不需要查看目录中每个文件大小的方式,那么答案是否定的。戴尔-谢谢。我的应用程序要求每个用户都有一个目录,我有32000多个用户。但让我们举一个极端的例子,我有1000000个用户——在这种情况下,我的文件系统怎么能真正避免大目录呢?更高层次的层次结构使您可以存储的名称数量呈指数级增长。例如,1000000等于1000平方。假设字母的用户名,26 ^ 2是676,或大约1000,所以你可以考虑文件名如“U/E/USER1”、“U/E/USER2”、“XY/ZZ/XYZY”、“PL/UG/PULH”等等。也就是说,如果你的百万用户中的每一个都选择以“user”开头的名字,你就有问题了。您可以通过对用户名进行散列并从散列中创建文件名来解决这个问题(请注意,git为其对象存储执行此操作)。最后,您可能需要考虑一个更完整的数据库,尽管像BDB之类的键/值系统或基于SQL的东西将取决于您想要如何操作和搜索数据。然后您可以使用它将其格式化为XXXXXXXX(例如,第一个用户将是00000001),您可以将其分成两个数字组:users/00/00/01/(user's stuff);用户/01/12/32/41/(用户的东西)。我们使用这个算法来存储大量的图像,目前效果不错。