Is link: примеры (PHP)

Функция is_link в PHP: примеры и применение
Раздел: Работа с файловой системой
is_link(string $filename): bool
Функция is_link() в PHP

Функция is_link() проверяет, является ли заданное имя файла символической ссылкой. Она используется для определения типа файла в файловой системе.

Когда используется функция:

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

Аргументы функции:

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

  • string $filename — путь к проверяемому файлу.

Функция возвращает true, если файл существует и является символической ссылкой. В противном случае возвращает false.

Примеры использования is_link()
Базовый пример
$link = 'symlink_to_file.txt';
if (is_link($link)) {
    echo "Это символическая ссылка.";
} else {
    echo "Это не символическая ссылка или файл не существует.";
}
Это не символическая ссылка или файл не существует.
Проверка существующей ссылки
// Создание символической ссылки
symlink('/var/www/original.txt', 'link.txt');
$result = is_link('link.txt');
var_dump($result);
bool(true)
Похожие функции в PHP

Проверяет существование файла или директории, но не различает тип. Используется для общей проверки наличия файла.

Определяет, является ли путь обычным файлом. Возвращает false для символических ссылок, которые указывают на файлы.

Проверяет, является ли путь директорией. Для символических ссылок, указывающих на директории, также возвращает true.

Когда какую функцию использовать

Для проверки именно символических ссылок применяется is_link(). Если нужно узнать, на что ссылается симлинк, используют readlink() в сочетании с is_file() или is_dir().

Типичные ошибки
Отсутствие проверки существования файла

Если файл не существует, функция вернет false, что можно спутать с отсутствием ссылки.

$check = is_link('non_existent_file.lnk');
var_dump($check);
bool(false)
Путь с NULL-байтами

Передача пути, содержащего нулевые байты, приводит к неожиданным результатам, так как они интерпретируются как конец строки.

// В PHP 8.0+ это вызовет ошибку TypeError
$result = is_link("file\0.txt");
Отсутствие прав доступа

При недостаточных правах на чтение директории, содержащей файл, функция может вернуть false даже для существующей ссылки.

Изменения в последних версиях PHP

В PHP 8.0 функция is_link() стала строже обрабатывать типы аргументов. Передача значения, отличного от строки, вызывает TypeError. Ранее такие значения приводились к строке.

// В PHP 8
$result = is_link(null); // TypeError
// В PHP 7
$result = is_link(null); // false без ошибки
Расширенные примеры
Рекурсивная проверка директории
Пример php
function findSymlinks($dir) {
    $links = [];
    $items = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir)
    );
    foreach ($items as $item) {
        if (is_link($item->getPathname())) {
            $links[] = $item->getPathname();
        }
    }
    return $links;
}
print_r(findSymlinks('.'));
Array
(
    [0] => ./link_to_config
    [1] => ./data/temp_link
)
Сравнение is_link() и is_file() для симлинков
Пример php
symlink('/etc/hosts', 'hosts_link');
echo 'is_link: ' . (is_link('hosts_link') ? 'true' : 'false') . "\n";
echo 'is_file: ' . (is_file('hosts_link') ? 'true' : 'false') . "\n";
is_link: true
is_file: true
Обработка относительных и абсолютных путей
Пример php
// Создание ссылки с относительным путем
symlink('./target.txt', 'relative_link.lnk');
// Создание ссылки с абсолютным путем
symlink('/home/user/target.txt', 'absolute_link.lnk');
echo 'Relative link check: ' . is_link('relative_link.lnk') . "\n";
echo 'Absolute link check: ' . is_link('absolute_link.lnk') . "\n";
Relative link check: 1
Absolute link check: 1
Безопасная проверка перед чтением
Пример php
$filename = 'user_input_link';
if (is_link($filename)) {
    $realPath = readlink($filename);
    if ($realPath !== false && strpos($realPath, '/safe/') === 0) {
        $content = file_get_contents($realPath);
    } else {
        echo 'Ссылка указывает за пределы разрешенной директории.';
    }
} else {
    echo 'Файл не является символической ссылкой.';
}
Аналоги в других языках

Is link в Python

В Python используют os.path.islink() из модуля os.

import os
result = os.path.islink('/path/to/link')
print(result)
True
JavaScript (Node.js)

В Node.js применяют метод lstat() из модуля fs и проверяют свойство isSymbolicLink().

const fs = require('fs');
fs.lstat('link.txt', (err, stats) => {
    if (err) console.log(err);
    else console.log(stats.isSymbolicLink());
});
true
Bash/Shell

В командной оболочке проверку выполняют с помощью теста -L.

if [ -L "link.txt" ]; then
    echo "Это символическая ссылка"
fi

PHP is_link function comments

En
Is link Tells whether the filename is a symbolic link