linkinfo()
Функция linkinfo() в PHP возвращает информацию о жёсткой ссылке и позволяет проверить её существование через поле st_dev структуры lstat().
Что такое функция linkinfo()?
Функция linkinfo() — это встроенная функция PHP, которая проверяет, существует ли ссылка, и в Unix-системах возвращает устройство, на котором она расположена. Конкретно она возвращает поле st_dev из структуры C stat, которую формирует системный вызов lstat() — целое число, идентифицирующее устройство (диск/раздел), где хранится ссылка.
На практике linkinfo() наиболее полезна как быстрая проверка существования: если функция возвращает 0 или положительное целое число, ссылка существует; если возвращает -1 или false — путь отсутствует, ссылка неактивна или недоступна. Несмотря на название, функция не возвращает количество жёстких ссылок — эту информацию можно получить из элемента nlink функций stat() или lstat().
На этой странице описаны синтаксис функции, возвращаемые значения, работающий пример, типичные ошибки и связанные функции файловой системы.
Синтаксис
linkinfo(string $path): int|falseФункция принимает единственный параметр:
$path— путь к символической или жёсткой ссылке, которую нужно проверить.
Функция возвращает:
- неотрицательное целое число (идентификатор устройства
st_dev), если ссылка существует, -1, если ссылку не удаётся прочитать, ноlstatчастично завершается успешно, илиfalse, если$pathне существует или недоступен.
Поскольку 0 является допустимым возвращаемым значением, которое некоторые платформы могут расценить как «ложное», всегда используйте сравнение !== false вместо простой проверки булева значения.
Как использовать функцию linkinfo()
Выполните следующие шаги:
- Укажите путь к символической или жёсткой ссылке, которую нужно проверить.
- Вызовите
linkinfo(), передав путь в качестве аргумента. - Сравните результат строго с
false, чтобы определить, существует ли ссылка.
В примере ниже создаётся реальный файл и символическая ссылка на него, после чего ссылка проверяется с помощью linkinfo():
<?php
// Set up a file and a symbolic link to it in the temp directory.
$target = tempnam(sys_get_temp_dir(), 'tgt');
$link = sys_get_temp_dir() . '/example_link';
@unlink($link); // remove a leftover link from a previous run
symlink($target, $link); // create the symlink
$info = linkinfo($link);
if ($info !== false) {
echo "The link '$link' exists. Device id (st_dev): $info" . PHP_EOL;
} else {
echo "The link '$link' does not exist or is inaccessible." . PHP_EOL;
}
// A path that doesn't exist fails: false on most systems, -1 on some
// Unix builds (a warning may also be emitted), so treat both as "missing".
$missing = @linkinfo('/no/such/link');
var_dump($missing === false || $missing === -1); // bool(true) -> "missing"
// Clean up.
unlink($link);
unlink($target);При типичном запуске выводится что-то вроде:
The link '/tmp/example_link' exists. Device id (st_dev): 16777220
bool(true)Конкретный идентификатор устройства зависит от вашей операционной системы и файловой системы, поэтому не следует его жёстко прописывать — важно лишь его наличие. Для несуществующего пути PHP возвращает false на большинстве платформ и -1 на некоторых Unix-сборках, именно поэтому в примере оба значения обрабатываются как «не найдено».
Типичные ошибки
- Windows. Функция
linkinfo()не имеет смысла в Windows и фактически лишь сообщает, является ли путь ссылкой. Используйте её только для проверки существования, но не для получения номера устройства. - Используйте
!== false, а не!$info. На некоторых системах действительная ссылка возвращает0, и свободная проверка расценит это как «отсутствует». - Функция не следует по ссылке.
linkinfo()проверяет саму ссылку (какlstat), а не файл, на который она указывает. Символическая ссылка на удалённый файл по-прежнему будет считаться существующей. - Не для подсчёта жёстких ссылок. Если нужно узнать количество жёстких ссылок, используйте
stat($path)['nlink'].
Связанные функции
symlink()— создать символическую ссылку.link()— создать жёсткую ссылку.readlink()— вернуть цель, на которую указывает символическая ссылка.is_link()— проверить, является ли путь символической ссылкой.lstat()— получить полную информацию о ссылке без её разыменования.
Заключение
Функция linkinfo() — это лёгкий способ убедиться в существовании ссылки и получить идентификатор устройства, на котором она хранится, отражая поле st_dev функции lstat(). Используйте её для проверки существования (всегда со строгим сравнением !== false), а для получения более подробной информации, например количества жёстких ссылок или типа ссылки, обращайтесь к stat() или is_link().