Windows案例问题上的PHP realpath

时间:2012-05-02 17:17:51

标签: php windows symlink

我的Windows服务器上有一个符号链接,它是这样的:

F:\>mkdir link-target
F:\>mklink /D link f:\link-target 

(注意符号链接目标中的小写f:

在PHP中我运行:

$dir = realpath('f:\link');
var_dump($dir);

$dir = realpath($dir);
var_dump($dir);

哪个输出:

string 'f:\link-target' (length=14)
string 'F:\link-target' (length=14)

注意第二个真实路径上的大小写改变。

这是一个错误,还是打算?最新的解决方法是什么?

打破这样的情况:

function check_link($to, $from) {
    if (realpath($to) !== realpath($from)) {
        ...
    }
}

用于检查$to是否存在,并且与$from相关联。

  • PHP 5.4
  • Windows 7

修改

我需要在Windows和Linux上保持一致的行为,并且以下工作是非常讨厌的:

if (realpath($from) === false) {
} elseif (realpath($to) === false) {
} else {
    do {
        $to = realpath($to);
    } while (realpath($to) !== false && $to !== realpath($to));
    do {
        $from = realpath($from);
    } while (realpath($from) !== false && $from !== realpath($from));
    if ($to !== $from) {
        ...
    }
}

编辑2:

在进一步的调查中,我注意到在Windows上,符号链接只跟随1级深度:

// F:\>mkdir link-target
// F:\>mklink /D link f:\link-target 
// F:\>mklink /D link2 f:\link

$dir = realpath('f:\link2');
var_dump($dir);

$dir = realpath($dir);
var_dump($dir);

$dir = realpath($dir);
var_dump($dir);

// string 'f:\link' (length=7)
// string 'f:\link-target' (length=14)
// string 'F:\link-target' (length=14)

2 个答案:

答案 0 :(得分:1)

结果

do {
    $to = realpath($to);
} while (realpath($to) !== false && $to !== realpath($to));

是唯一的方法。

https://bugs.php.net/bug.php?id=61933

答案 1 :(得分:0)

如果您认真考虑,这是有道理的。对于第一个路径解析,它正在查找定义为链接目标的内容。对于第二个,你最终会得到相同的路径,但是一个路径为驱动器号的正确大写。

在Windows文件系统下,路径/文件名不区分大小写。要比较它们,只需在测试前将它们转换为大写或小写。

if (strtoupper(realpath($to)) !== strtotupper(realpath($from))) {