优化文件导航器

  • 本文关键字:导航 文件 优化 php
  • 更新时间 :
  • 英文 :


我想出了一个基本的文件导航器,它接受用户输入跳转到不同的目录。我唯一的问题是我基本上循环了三次数据:

  1. 获取所有目录的有效列表,以便与用户输入进行比较
  2. 构建目录和文件的"排序"列表
  3. 输出最终列表

关于优化或改进此代码的任何提示?

define('ROOT', '/path/to/somewhere');
// get a list of valid paths
$valid = array();
$dir = new RecursiveDirectoryIterator(ROOT);
$dir->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
$iter = new ParentIterator($dir);
foreach(new RecursiveIteratorIterator($iter, RecursiveIteratorIterator::SELF_FIRST) as $file) {
    $path = str_replace(ROOT, '', $file->getPathname());
    $valid[] = $path;
}
// user input
$subpath = isset($_GET['path']) && in_array($_GET['path'], $valid) ? $_GET['path'] : NULL;
$cwd = isset($subpath) ? ROOT.$subpath : ROOT;
// build and sort directory tree
$files = array();
foreach(new DirectoryIterator($cwd) as $file) {
    if($file->isDot()) {
        continue;
    }
    if($file->isDir()) {
        $path = str_replace(ROOT, '', $file->getPathname());
        $count = iterator_count(new RecursiveDirectoryIterator($file->getRealPath(), FilesystemIterator::SKIP_DOTS));
        $files[$path]['name'] = $file->getFilename();
        $files[$path]['count'] = $count;
    } else {
        $files[] = $file->getFilename();
    }
    asort($files);
}
// output directory tree
if(!empty($files)) {
    foreach($files as $key=>$value) {
        if(is_array($value)) {
            echo "<a href="?path=$key">{$value['name']} ({$value['count']})</a><br />";
        } else {
            echo "$value<br />";
        }
    }
}

目录结构多久会更改一次?是否可以缓存它并且仅在有更改时而不是在每个请求上重新生成白名单?这将是我的方法,具体取决于要求和负载因素。除此之外,可能还有微优化的领域。

最新更新