Windows案例问题的PHP实时path

我在我的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) 

注意第二个实时path上的情况变化。

这是一个错误,或打算? 最好的解决办法是什么?

这是打破这样的情况:

 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) 

结果

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

是唯一的方法。

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

这是有道理的,如果你想通过。 对于第一个路径分辨率,它是找到什么被定义为链接目标。 对于第二种情况,您将得到相同的路径,但是具有正确的驱动器盘符的大小写。

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

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