0

ユーザー入力を受け入れて別のディレクトリにジャンプする基本的なファイルナビゲーターを思いつきました。私が抱えている唯一の問題は、基本的にデータを 3 回ループしていることです。

  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 />";
        }
    }
}
4

1 に答える 1

0

ディレクトリ構造はどのくらいの頻度で変更されますか? リクエストごとではなく、変更があった場合にのみキャッシュしてホワイトリストを再生成できますか? これは、要件と負荷要因に応じた私のアプローチです。それ以上に、おそらくマイクロ最適化の領域があります。

于 2012-10-03T16:14:19.143 に答える