如何计算PHP中一组路径和符号链接的最小公分母?

时间:2014-12-17 15:00:47

标签: php symlink path-iterator

我得到一个路径数组(从默认设置和用户设置组合),并且需要对某些数据文件执行递归搜索,这些数据文件可以隐藏在这些路径中的数万个文件之间。

我使用RecursiveDirectoryIterator进行递归搜索,但速度非常慢,建议的替代exec("find") is even slower。为了节省时间,I / O和处理能力,我希望事先做一些预处理,以避免多次搜索目录树并计算给定路径的最小公分母。我很感激有关如何做到这一点的任何建议。

问题在于,任何给定路径可能不仅是其他路径的祖先,或者只是彼此符号链接,而是可以作为实际路径或符号链路的路径给出。至少有一个人可能认为没有任何盘旋符号链接(虽然支票不会很糟糕)。

我需要在PHP中实现这一点,并且我勾勒出了以下代码,该代码还没有覆盖所有案例。

// make all given paths absolute and resolve symlinks
$search_paths = array_map( function($path) {
    return realpath( $path ) ?: $path;
}, $search_paths );

// remove all double entries
$search_paths = array_unique( $search_paths );

// sort by length of path, shortest first
usort($search_paths, function($a, $b) {
    return strlen($a) - strlen($b);
});

// iterate over all paths but the last
for ( $i = 0; $i < count( $search_paths ) - 1; $i++ ) {
    // iterate over all paths following the current
    for ( $j = $i; $j < count( $search_paths ); $j++ ) {
        if ( strpos ( $search_paths[$j], $search_paths[$i] ) === 0 ) {
            // longer path starts with shorter one, thus it's a child. Nuke it!
            unset( $search_paths[$j] );
        }
    }
}

此代码不足的地方: 想象一下$search_paths

中的这些路径
/e/f
/a/b/c/d
/e/f/g/d

/e/f/g/d/a/b/c/d的符号链接。

上面的代码会留下这两个:

/e/f
/a/b/c/d

但搜索/e/f实际上已足够,因为它通过符号链接/a/b/c/d覆盖/e/f/g/d。这可能听起来像一个边缘情况,但实际上很可能在我的情况下。

整蛊,嗯?

我很确定我不是唯一一个遇到此问题的人,但我无法使用谷歌找到解决方案。也许我只是没有对问题采取正确的措辞。

感谢您阅读此内容! :)

0 个答案:

没有答案