is_link()
Функция is_link() в PHP проверяет, является ли указанный путь символической ссылкой, и возвращает true, если это так.
Что делает функция is_link()
Символическая ссылка (или симлинк) — это специальный файл, который указывает на другой файл или директорию, подобно ярлыку. Функция is_link() — это встроенная функция PHP, которая определяет, является ли указанный путь символической ссылкой.
Она возвращает:
true— если путь существует и является символической ссылкой.false— если путь является обычным файлом или директорией, не существует или недоступен для чтения.
Важный момент, который часто вызывает путаницу: is_link() проверяет сам путь, а не то, на что ссылка указывает. Симлинк, указывающий на обычный файл, всё равно распознаётся как ссылка функцией is_link(), даже несмотря на то, что is_file() тоже вернёт true для того же пути (поскольку она следует по ссылке к целевому файлу).
На этой странице рассматриваются синтаксис, полный рабочий пример, наиболее распространённая ловушка (кэш статистики) и отличия is_link() от связанных функций проверки файловой системы.
Синтаксис
is_link(string $filename): bool$filename — путь для проверки. Функция возвращает boolean.
Полный рабочий пример
Поскольку символическая ссылка редко существует по жёстко заданному пути, наиболее надёжный способ увидеть работу is_link() — сначала создать её с помощью symlink(), проверить, а затем удалить:
<?php
$target = tempnam(sys_get_temp_dir(), 'tgt'); // a real regular file
$link = sys_get_temp_dir() . '/my_symlink';
// Make sure we start clean, then create the symlink.
@unlink($link);
symlink($target, $link);
var_dump(is_link($link)); // bool(true) — the path is a symlink
var_dump(is_link($target)); // bool(false) — the target is a regular file
var_dump(is_file($link)); // bool(true) — is_file() follows the link
// Clean up.
unlink($link);
unlink($target);is_link($link) возвращает true, потому что путь является симлинком, а is_link($target) — false, потому что целевой файл является обычным файлом. Заметьте, что is_file($link) возвращает true — она разрешает ссылку и проверяет целевой файл.
Ловушка с кэшем статистики
PHP кэширует результаты функций файловой системы, таких как is_link(), is_file() и file_exists(), в целях производительности. Если во время выполнения скрипта вы создаёте, удаляете или заменяете символическую ссылку, а затем повторно её проверяете, вы можете получить устаревший результат. Вызовите clearstatcache(), чтобы принудительно обновить данные:
<?php
$link = sys_get_temp_dir() . '/cache_demo';
@unlink($link);
symlink(__FILE__, $link);
var_dump(is_link($link)); // bool(true)
unlink($link);
clearstatcache(); // without this, the next check may still say true
var_dump(is_link($link)); // bool(false)is_link() в сравнении со связанными функциями
| Функция | Возвращает true, если путь является… |
|---|---|
is_link() | символической ссылкой (не следует по ссылке) |
is_file() | обычным файлом (следует по ссылке к цели) |
is_dir() | директорией (следует по ссылке к цели) |
file_exists() | целевой объект существует (следует по ссылке) |
Чтобы узнать, куда указывает ссылка, используйте readlink(); чтобы разрешить путь с раскрытием всех симлинков, используйте realpath().
Когда это применяется?
- Скрипты развёртывания, которые переключают симлинк
currentмежду директориями релизов и должны убедиться, что это действительно ссылка, прежде чем заменить её. - Инструменты резервного копирования или синхронизации, которые должны решить, копировать саму ссылку или файл, на который она указывает.
- Проверки безопасности, отклоняющие пути, переданные пользователем, которые пробираются через симлинки, указывающие за пределы разрешённой директории.
Заключение
is_link() отвечает на один конкретный вопрос: является ли этот путь символической ссылкой? Функция проверяет сам путь, не следуя по нему, возвращает false для несуществующих путей и использует кэш статистики PHP — поэтому вызывайте clearstatcache(), если вы изменяете ссылки в середине скрипта. Используйте её совместно с is_file(), readlink() и realpath(), когда нужно узнать, на что указывает ссылка.