从50,000个文件NFS安装目录中检索目录树的更好方法

时间:2015-03-13 13:28:35

标签: php linux nfs

我被引入了现有的CMS和文件管理Web应用程序,该应用程序为商家提供了在线网上商店的管理界面。管理应用程序是用PHP开发的。

当网站用户正在查看网上商店时,页面资源(主要是嵌套文件夹路径中的图像)直接从网上商店的HTML中引用,并直接从与CMS系统分开的Web服务器提供。

但是为了列出/搜索/允许导航文件(即文件管理部分),CMS应用程序需要能够访问文件/文件夹目录结构。

因此,我们正在从CMS服务器使用Linux NFS挂载到文档文件服务器。如果任何特定商家的目录树中的文件数量不是太大(<10000),则这很有效。但是,某些商家在嵌套目录树中有超过100000个文件。走这么大的树来获得目录结构可能需要120多秒。

只检索任何一个目录中的文件列表非常快,但是当我们尝试识别这些“文件”中的哪些实际是目录条目时会出现问题,因此我们可以递归树。

似乎PHP函数检查文件类型(在使用“readdir”或“scandir”检索的每个文件路径上调用“is_dir”,或者使用带有标记GLOB_ONLYDIR的“glob”)分别处理每个文件,而不是块。因此,现在发送了1000和1000个NFS命令。从我目前的研究来看,似乎这是NFS的限制,而不是PHP的限制。

一个简化的课程,只显示有问题的功能:

class clImagesDocuments {

    public $dirArr;

    function getDirsRecursive( $dir ) {

        if ( !is_dir( $dir )) {
            return false;
        }

        if ( !isset( $this->dirArr )) {
            $this->dirArr = glob( $dir . "/*", GLOB_ONLYDIR );
        } else {
            $this->dirArr = array_merge( $this->dirArr, glob( $dir . "/*", GLOB_ONLYDIR ) );
            return false;
        }

        for( $i = 0; $i < sizeof( $this->dirArr ); $i ++) {
            $this->getDirsRecursive( $this->dirArr [$i] );
        }

        for( $i = 0; $i < sizeof( $this->dirArr ); $i ++) {
            $indexArr = explode( $dir, $this->dirArr [$i] );
            $tempDir[$indexArr[1]] = $this->dirArr [$i];
        }

        $this->dirArr = $tempDir;
    }
}

执行相同的PHP代码以在文件文档服务器上本地检索目录树等的速度要快得多(2或3个数量级),可能是因为本地文件系统正在缓存目录结构。我被迫认为我的问题是由于NFS。

我正在考虑编写一个简单的webapp,它将在文件文档webserver上运行,并通过API提供目录结构的实时查找。

我很感激任何想法或建议。

2 个答案:

答案 0 :(得分:0)

另一种解决方案 - 您可以在所有目录前加上一些字符串,当您获得带有文件的列表时,您可以通过检查它们是否包含字符串来检查哪些是实际目录。您可以完全避免is_dir()那种方式。

答案 1 :(得分:0)

老问题,但对我来说是当前问题。

一种解决方案:

在性能更好的服务器(快得多)上,在每个目录上运行树https://linux.die.net/man/1/tree,并在每个目录上使用-X(XML输出),或在顶层目录上运行一次,然后将输出发送到“ .dirStructure.xml”文件(以。开头的文件,因此您可以从列表中忽略它)

例如 树-x -f -q -s -D -dirfirst -X

然后使您的脚本加载此结构并使用它显示树结构。您可以为每个商人或一个全球商人创建此文件,然后遍历它以查找商人。

您可以每分钟通过cron来运行它,或者创建和API来调用它在存储计算机上运行。

更改文件时可以更新此xml。

无需数据库。

您还可以在存储端监视对目录的更改,并在每次更改时重新创建xml。 https://superuser.com/questions/181517

编辑: How to monitor a complete directory tree for changes in Linux?