W3docs

is_link()

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

Символическая ссылка (или симлинк) — это специальный файл, который указывает на другой файл или директорию, подобно ярлыку. Функция 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)
ФункцияВозвращает true, если путь является…
is_link()символической ссылкой (не следует по ссылке)
is_file()обычным файлом (следует по ссылке к цели)
is_dir()директорией (следует по ссылке к цели)
file_exists()целевой объект существует (следует по ссылке)

Чтобы узнать, куда указывает ссылка, используйте readlink(); чтобы разрешить путь с раскрытием всех симлинков, используйте realpath().

Когда это применяется?

  • Скрипты развёртывания, которые переключают симлинк current между директориями релизов и должны убедиться, что это действительно ссылка, прежде чем заменить её.
  • Инструменты резервного копирования или синхронизации, которые должны решить, копировать саму ссылку или файл, на который она указывает.
  • Проверки безопасности, отклоняющие пути, переданные пользователем, которые пробираются через симлинки, указывающие за пределы разрешённой директории.

Заключение

is_link() отвечает на один конкретный вопрос: является ли этот путь символической ссылкой? Функция проверяет сам путь, не следуя по нему, возвращает false для несуществующих путей и использует кэш статистики PHP — поэтому вызывайте clearstatcache(), если вы изменяете ссылки в середине скрипта. Используйте её совместно с is_file(), readlink() и realpath(), когда нужно узнать, на что указывает ссылка.

Практика

Практика
Что делает функция is_link() в PHP?
Что делает функция is_link() в PHP?
Was this page helpful?