在Windows案例问题的真实路径PHP(PHP realpath on Windows Case

2019-09-16 23:34发布

我这是犯了这样的我的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:

在furter调查中,我已经注意到了,在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)

Answer 1:

原来

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

是唯一的出路。

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



Answer 2:

这是有道理的,如果你认为它通过。 对于第一条路径的分辨率,它是找到什么被定义为链接的目标。 对于第二个,你最终以相同的路径,但一个与正确的大写的驱动器号。

在Windows文件系统路径/文件名不区分大小写。 对它们进行比较,在测试前都转换为大写或小写。

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


文章来源: PHP realpath on Windows Case Issue