Lstat: примеры (PHP)

Руководство по применению lstat для анализа файлов в PHP
Раздел: Работа с файловой системой
lstat(string $filename): array|false

Функция lstat() в PHP используется для получения информации о файле или символической ссылке. В отличие от функции stat(), она возвращает данные о самой символической ссылке, а не о файле, на который эта ссылка указывает.

Назначение

Использование функции актуально при необходимости работы с символическими ссылками в файловой системе. Она помогает определить, является ли элемент файлом или ссылкой, а также получить его метаданные.

Аргументы

Функция принимает один обязательный параметр:

  • $filename (string) - путь к файлу или символической ссылке для анализа.

Возвращает проиндексированный массив со статистикой или false в случае ошибки. Структура массива идентична возвращаемой функцией stat().

Базовые примеры
Получение информации о файле
<?php
$result = lstat('/path/to/file.txt');
print_r($result);
?>
Array
(
    [0] => 2065
    [1] => 15
    [2] => 33188
    [3] => 1
    [4] => 1000
    [5] => 1000
    [6] => 0
    [7] => 1024
    [8] => 1633040000
    [9] => 1633040000
    [10] => 1633040000
    [11] => 4096
    [12] => 8
    [dev] => 2065
    [ino] => 15
    [mode] => 33188
    [nlink] => 1
    [uid] => 1000
    [gid] => 1000
    [rdev] => 0
    [size] => 1024
    [atime] => 1633040000
    [mtime] => 1633040000
    [ctime] => 1633040000
    [blksize] => 4096
    [blocks] => 8
)
Анализ символической ссылки
<?php
// Создаем ссылку для примера
symlink('/path/to/target.txt', '/path/to/link');
$linkInfo = lstat('/path/to/link');
echo 'Размер ссылки: ' . $linkInfo['size'] . ' байт';
?>
Размер ссылки: 15 байт
Похожие функции PHP
  • stat() - возвращает информацию о файле, но для символических ссылок анализирует конечный файл.
  • fstat() - работает с открытым файловым указателем (дескриптором).
  • filemtime(), filesize() - возвращают отдельные метаданные файла.
  • is_link() - проверяет, является ли путь символической ссылкой.

Функцию lstat() предпочтительнее использовать при работе с символическими ссылками, когда нужны данные именно о ссылке, а не о целевом объекте.

Типичные ошибки
Несуществующий путь
<?php
$result = lstat('/несуществующий/путь');
var_dump($result);
?>
bool(false)
Отсутствие прав доступа
<?php
// При попытке анализа файла без прав на чтение
$result = @lstat('/root/.bashrc');
if ($result === false) {
    echo 'Ошибка получения информации';
}
?>
Ошибка получения информации
Пустая строка как аргумент
<?php
$result = lstat('');
var_dump($result);
?>
bool(false)
История изменений

В PHP 8 значительных изменений в работе функции lstat() не произошло. Основное поведение сохранилось с предыдущих версий.

В PHP 7.4 и более ранних версиях функция также работала стабильно. Важно учитывать, что в Windows символические ссылки до PHP 7.2 обрабатывались с ограничениями.

Расширенные примеры
Сравнение lstat() и stat() для ссылок
Пример php
<?php
touch('target.txt');
symlink('target.txt', 'link.txt');
$lstat = lstat('link.txt');
$stat = stat('link.txt');
echo 'lstat size: ' . $lstat['size'] . '\n';
echo 'stat size:  ' . $stat['size'] . '\n';
unlink('link.txt');
unlink('target.txt');
?>
lstat size: 10
stat size:  0
Определение типа элемента
Пример php
<?php
function checkType($path) {
    $stat = lstat($path);
    if (!$stat) return 'Ошибка';
    
    $mode = $stat['mode'];
    if (($mode & 0xC000) === 0xC000) return 'Сокет';
    elseif (($mode & 0xA000) === 0xA000) return 'Ссылка';
    elseif (($mode & 0x8000) === 0x8000) return 'Файл';
    elseif (($mode & 0x6000) === 0x6000) return 'Блочное устройство';
    elseif (($mode & 0x4000) === 0x4000) return 'Директория';
    elseif (($mode & 0x2000) === 0x2000) return 'Символьное устройство';
    elseif (($mode & 0x1000) === 0x1000) return 'FIFO';
    return 'Неизвестно';
}

echo checkType('link.txt');
?>
Ссылка
Мониторинг изменений размера ссылки
Пример php
<?php
$link = 'dynamic_link';
$target = 'dynamic_target.txt';

touch($target);
symlink($target, $link);

$initial = lstat($link)['size'];
file_put_contents($target, 'Новые данные');
rename($target, $target . '_new');
symlink($target . '_new', $link);

$new = lstat($link)['size'];
echo 'Изменение размера ссылки: ' . ($new - $initial) . ' байт';

unlink($link);
unlink($target . '_new');
?>
Изменение размера ссылки: 4 байт
Аналоги в других языках

Lstat в Python

Функция os.lstat() модуля os работает аналогично.

import os
stat_info = os.lstat('/path/to/link')
print(stat_info.st_size)
15
Node.js

Используется fs.lstat() или fs.lstatSync().

const fs = require('fs');
fs.lstat('/path/to/link', (err, stats) => {
  console.log(stats.size);
});
Bash/Shell

Команда stat -L получает информацию о файле, а без флага -L - о ссылке.

stat -c%s /path/to/link
15

PHP lstat function comments

En
Lstat Gives information about a file or symbolic link