PHP link() 函数

提示:link() 函数用于创建一个硬链接(hard link)。硬链接是文件系统中同一个文件的多个引用,它们共享相同的inode。注意:硬链接不能用于目录,并且只能在同一个文件系统中创建。

定义和用法

link() 函数创建一个硬链接。

硬链接是指向同一inode的多个文件名。删除其中一个硬链接不会影响其他硬链接,只有当所有硬链接都被删除时,文件的数据才会被真正删除。

语法

link ( string $target , string $link ) : bool

参数

参数 类型 说明
target 字符串 要链接的目标文件(必须存在)
link 字符串 链接的名称(新的硬链接)

返回值

成功时返回 true,失败时返回 false

示例

示例 1:创建硬链接

此示例需要在支持硬链接的系统(如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";
}
?>

示例 2:检查是否为硬链接

<?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);
}
?>

示例 3:错误处理

<?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";
}
?>

注意事项

  • 跨文件系统限制:硬链接不能跨文件系统创建(即目标文件和链接必须在同一个文件系统上)
  • 目录限制:硬链接不能用于目录(大多数操作系统不允许)
  • 权限要求:对目标文件所在目录需要有写权限
  • Windows系统:在Windows上,link()函数的行为可能不同,且可能不可用
  • 与符号链接的区别:硬链接是直接指向inode,而符号链接是一个特殊的文件,包含指向另一个文件的路径

硬链接与符号链接的区别

特性 硬链接 符号链接
创建函数 link() symlink()
inode 与目标文件相同 有自己的inode
跨文件系统 不可以 可以
链接到目录 不可以 可以
目标删除后 链接仍有效(直到所有硬链接被删除) 链接失效(悬空链接)
文件大小 与目标文件相同 很小(只存储路径)

相关函数