我的 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
.
Edit:
我需要在 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) {
...
}
}
Edit 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)