【问题标题】:php RecursiveDirectoryIterator show only folder and subfoldernamesphp RecursiveDirectoryIterator 仅显示文件夹和子文件夹名
【发布时间】:2014-11-29 10:41:02
【问题描述】:

我的网站变慢了,我发现了问题:

这部分在这里加载大约需要 2/2.5 somtimes 3 秒:

$root = 'assets/img/fotogalerij';
    $iter = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::SELF_FIRST,
        RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
    );

    $paths = array($root);
    unset($paths[0]);
    foreach ($iter as $path => $dir) {
        if ($dir->isDir()) {
            $paths[] = str_replace($root, '', $path);
        }
    }

我在这个目录中有大约 2200 个文件 if ($dir->isDir()) 部分是瓶颈。

检查 isDir 2200 次有点费钱

有没有更有效的方法只显示文件夹和子文件夹名称?

我不关心文件,我只想要文件夹和子文件夹名

我是这个领域的新手,我发现的关于这个问题的信息是关于仅显示当前文件夹名称或列出文件名(如 opendir、readdir、scandir、glob 等)

【问题讨论】:

  • 应用 iterator_to_array/array_map("is_dir") 将避免中断的循环内 isDir 探测;但不太可能显着提高性能。鉴于文件夹结构相当大,使用find . -type d 避开​​ PHP 虚拟机可能值得一试。

标签: php performance


【解决方案1】:

设置保存目录和子目录列表的字段或数据库表。然后设置一个简单的 incrond (http://inotify.aiken.cz) 任务来执行一个脚本,每次目录树结构发生变化时,该脚本将从该列表中添加/删除项目。

实际上,您将拥有目录/子目录列表的“缓存”版本,并且会自动更新。作为一件好事,它很容易设置

【讨论】:

  • 我将制作一个sql数据库表并在后端/CMS中创建一个填充目录结构的函数。
猜你喜欢
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
相关资源
最近更新 更多