PHP lstat() 函数

提示:lstat() 函数用于获取文件或符号链接的信息。与 stat() 函数不同,当文件是一个符号链接时,lstat() 返回的是符号链接本身的信息,而不是它指向的文件信息。

定义和用法

lstat() 函数返回关于文件或符号链接的信息。

这个函数会返回一个包含文件统计信息的数组。如果是符号链接,返回的是符号链接本身的信息,而不是链接指向的文件信息。

语法

lstat ( string $filename ) : array|false

参数

参数 类型 说明
filename 字符串 文件或符号链接的路径

返回值

成功时返回一个包含文件统计信息的数组,失败时返回 false

返回的数组包含以下元素:

数字下标 关联键名 说明
0 dev 设备号
1 ino inode 号
2 mode inode 保护模式
3 nlink 链接数
4 uid 所有者的用户ID
5 gid 所有者的组ID
6 rdev 设备类型(如果是 inode 设备)
7 size 文件大小的字节数
8 atime 上次访问时间(Unix 时间戳)
9 mtime 上次修改时间(Unix 时间戳)
10 ctime 上次 inode 改变时间(Unix 时间戳)
11 blksize 文件系统 I/O 的块大小
12 blocks 分配的 512 字节块数

示例

示例 1:获取普通文件信息

<?php
$filename = 'example.txt';

// 创建一个文件
file_put_contents($filename, 'Hello World!');

// 使用 lstat() 获取文件信息
$info = lstat($filename);

if ($info !== false) {
    echo "文件: $filename\n";
    echo "大小: " . $info['size'] . " 字节\n";
    echo "权限: " . decoct($info['mode'] & 0777) . "\n";
    echo "用户ID: " . $info['uid'] . "\n";
    echo "组ID: " . $info['gid'] . "\n";
    echo "最后修改时间: " . date('Y-m-d H:i:s', $info['mtime']) . "\n";
    echo "最后访问时间: " . date('Y-m-d H:i:s', $info['atime']) . "\n";
} else {
    echo "无法获取文件信息\n";
}

// 清理
unlink($filename);
?>

示例 2:lstat() 与 stat() 的区别(符号链接)

<?php
$target = 'target_file.txt';
$link = 'link_to_target.txt';

// 创建目标文件
file_put_contents($target, '这是一个目标文件。');

// 创建符号链接
symlink($target, $link);

// 使用 lstat() 获取符号链接信息
$linkInfo = lstat($link);
echo "lstat() 结果(符号链接本身):\n";
echo "大小: " . $linkInfo['size'] . " 字节\n";
echo "inode: " . $linkInfo['ino'] . "\n\n";

// 使用 stat() 获取目标文件信息
$targetInfo = stat($target);
echo "stat() 结果(目标文件):\n";
echo "大小: " . $targetInfo['size'] . " 字节\n";
echo "inode: " . $targetInfo['ino'] . "\n\n";

// 比较 inode
if ($linkInfo['ino'] !== $targetInfo['ino']) {
    echo "lstat() 和 stat() 返回不同的 inode,证明 lstat() 返回的是符号链接本身的信息。\n";
}

// 清理
unlink($link);
unlink($target);
?>

示例 3:获取文件类型和权限

<?php
function getFileType($mode) {
    $types = [
        0010000 => '命名管道',
        0020000 => '字符设备',
        0040000 => '目录',
        0060000 => '块设备',
        0100000 => '普通文件',
        0120000 => '符号链接',
        0140000 => '套接字'
    ];

    $fileType = $mode & 0170000; // 获取文件类型位
    return $types[$fileType] ?? '未知类型';
}

$files = [
    'regular.txt',
    '/dev/null',  // 字符设备(Linux)
    '/tmp'        // 目录
];

foreach ($files as $file) {
    if (file_exists($file)) {
        $info = lstat($file);
        if ($info !== false) {
            $type = getFileType($info['mode']);
            $permissions = decoct($info['mode'] & 0777);
            echo "$file:\n";
            echo "  类型: $type\n";
            echo "  权限: $permissions\n";
            echo "  inode: " . $info['ino'] . "\n\n";
        }
    }
}
?>

注意事项

  • 符号链接处理:lstat() 返回符号链接本身的信息,而 stat() 返回符号链接指向的文件信息
  • 性能考虑:lstat() 调用会触发文件系统访问,对性能有一定影响,特别是在循环中调用时
  • 缓存:结果会被 PHP 缓存,后续调用可能返回缓存结果。使用 clearstatcache() 清除缓存
  • 权限要求:需要对文件所在目录有执行权限才能获取文件信息
  • Windows 平台:某些字段(如 inode、设备号)在 Windows 上可能没有实际意义

返回数组详解

字段 详细说明
dev 文件所在的设备号。在 POSIX 系统中,每个文件系统都有一个唯一的设备号
ino inode 号。文件系统上文件的唯一标识符(Windows 上通常为 0)
mode 文件模式,包含文件类型和权限。可以使用位掩码获取具体信息
nlink 硬链接数。普通文件通常为 1,目录有多个硬链接(包括 . 和 ..)
uid/gid 所有者的用户 ID 和组 ID
size 文件的字节大小。对于符号链接,返回的是链接路径的长度
atime/mtime/ctime 访问时间、修改时间和 inode 修改时间(不是创建时间)

相关函数