link() 函数创建一个硬链接。
硬链接是指向同一inode的多个文件名。删除其中一个硬链接不会影响其他硬链接,只有当所有硬链接都被删除时,文件的数据才会被真正删除。
link ( string $target , string $link ) : bool
| 参数 | 类型 | 说明 |
|---|---|---|
target |
字符串 | 要链接的目标文件(必须存在) |
link |
字符串 | 链接的名称(新的硬链接) |
成功时返回 true,失败时返回 false。
此示例需要在支持硬链接的系统(如Linux、Unix)上运行。
<?php
$target = 'original.txt';
$link = 'hardlink.txt';
// 创建目标文件
file_put_contents($target, '这是一个原始文件的内容。');
// 创建硬链接
if (link($target, $link)) {
echo "硬链接创建成功!\n";
// 读取两个文件的内容,应该相同
echo "原始文件内容: " . file_get_contents($target) . "\n";
echo "硬链接内容: " . file_get_contents($link) . "\n";
// 删除原始文件,硬链接仍然可以访问
unlink($target);
if (file_exists($link)) {
echo "删除原始文件后,硬链接仍然存在。\n";
echo "硬链接内容: " . file_get_contents($link) . "\n";
}
// 清理
unlink($link);
} else {
echo "创建硬链接失败。\n";
}
?>
<?php
$target = 'file.txt';
$link = 'link_to_file.txt';
// 创建文件
file_put_contents($target, '内容');
// 创建硬链接
if (link($target, $link)) {
// 获取两个文件的inode号
$targetInode = fileinode($target);
$linkInode = fileinode($link);
echo "目标文件的inode: " . $targetInode . "\n";
echo "硬链接的inode: " . $linkInode . "\n";
if ($targetInode === $linkInode) {
echo "这两个文件是同一个inode,即硬链接关系。\n";
} else {
echo "这两个文件不是硬链接关系。\n";
}
// 清理
unlink($target);
unlink($link);
}
?>
<?php
$target = 'nonexistent.txt';
$link = 'hardlink.txt';
// 尝试为不存在的文件创建硬链接
if (@link($target, $link)) {
echo "硬链接创建成功。\n";
} else {
echo "创建硬链接失败,目标文件可能不存在。\n";
}
// 尝试创建跨文件系统的硬链接(可能会失败)
$target2 = '/mnt/another_fs/file.txt'; // 假设这是另一个文件系统
$link2 = 'link2.txt';
if (@link($target2, $link2)) {
echo "跨文件系统硬链接创建成功。\n";
} else {
echo "跨文件系统创建硬链接失败,可能因为目标在另一个文件系统。\n";
}
?>
| 特性 | 硬链接 | 符号链接 |
|---|---|---|
| 创建函数 | link() | symlink() |
| inode | 与目标文件相同 | 有自己的inode |
| 跨文件系统 | 不可以 | 可以 |
| 链接到目录 | 不可以 | 可以 |
| 目标删除后 | 链接仍有效(直到所有硬链接被删除) | 链接失效(悬空链接) |
| 文件大小 | 与目标文件相同 | 很小(只存储路径) |