澄清一下
在 Unix/Linux 中
硬链接(通过此函数)不能跨越不同的文件系统。
软链接可以指向任何地方。
在 Linux 中,不允许对目录进行硬链接。
(PHP 4, PHP 5, PHP 7, PHP 8)
link — 创建硬链接
target
链接的目标。
link
链接名。
如果 link
已经存在,或者 target
不存在,则函数失败并发出 E_WARNING
。
示例 #1 创建一个简单的硬链接
<?php
$target = 'source.ext'; // 此文件已存在
$link = 'newfile.ext'; // 这是您要链接到的文件名
link($target, $link);
?>
对于备份实用程序,我需要在 Windows 系统上使用类似链接的功能。由于 Windows 上不可用,我尝试使用一些工具自己完成它。您只需要来自 sysinternals 的 junction.exe 位于您的 %PATH% 中。
<?php
if(!function_exists('link')){ // 假设为 Windows 系统
function link($target, $link){
if(is_dir($target)){
// junctions 在 windows 中链接到目录
exec("junction $link $target", $lines, $val);
return 0 == $val;
}elseif(is_file($target)){
// Hardlinks 在 windows 中链接到文件
exec("fsutil hardlink create $link $target", $lines, $val);
return 0 == $val;
}
return false;
}
}
?>
http://www.sysinternals.com/Utilities/Junction.html
我注意到,与 Unix ln 命令不同,第二个参数不能是目录名,即,如果要创建与目标文件同名的链接(显然在不同的目录中),则必须在链接参数中指定文件名。
示例
Unix ln 命令
ln /dir1/file /dir2/ // ok,创建 /dir2/file 链接
PHP link 函数
link ("/dir1/file", "/dir2/"); // 错误,给出“文件已存在”警告
link ("/dir1/file", "/dir2/file"); // ok,创建 /dir2/file 链接