Жесткие и символические ссылки в PHP. Как создавать их и использовать?

жесткие и символические ссылки в php. как создавать их и использовать?

Как работают ссылки на файлы и директории

Распространенной проблемой при работе с файловой системой, в том числе и с помощью PHP, является дублирование файлов. Например, в операционной системе Linux каждому пользователю отводится отдельная директория, расположенная в /home. Что делать если необходимо дать разным пользователям возможность редактировать один и тот же файл? Можно создать отдельные файлы в каждой директории пользователя и синхронизировать их программным путем, или расположить файл в системной папке, а пользователям предоставить на него ссылки.

Начиная с версии 5.3.0 PHP-интерпретатора, работа со ссылками происходит единообразно, как в операционной системе Windows, так и в Linux. Ссылки бывают двух видов: жесткие и символические. Принципы их работы отличаются очень сильно.

Символическая ссылка — содержит абсолютный, или относительный путь до файла, или директории. В графическом окне файлового менеджера такая ссылка ничем не выделяется. Если вы щелкните по ней два раза левой кнопкой мыши, откроется содержимое связанного с ней файла или директории.

Особенности символических ссылок:

  • Можно устанавливать на директории или файлы.
  • Имеет собственные права доступа, отличные от целевого файла.
  • При удалении целевого файла ссылка остается нетронутой.
  • Не привязана к конкретной файловой системе. Если вы скопируете ссылку на другое устройство, она продолжит функционировать.
  • Перемещение целевого файла в другое место вызовет ошибки при обращении к символической ссылке.

Жесткая ссылка — устанавливает связь с идентификатором файла в конкретной файловой системе. Это более низкоуровневое решение. При его использовании каждая жесткая ссылка, по сути, является тем самым файлом. Даже если вы удалите оригинальный файл, ссылки все равно продолжат существовать и функционировать. Через них можно будет получить содержимое.

Особенности жестких ссылок:

  • Можно устанавливать только на файлы.
  • Имеет права доступа, аналогичные целевому файлу.
  • Удаление содержимого файла произойдет после удаления всех жестких ссылок, указывающих на его идентификатор.
  • Привязана к конкретной файловой системе. Невозможно скопировать на другое устройство.
  • Перемещение целевого файла не ломает жесткие ссылки, указывающие на него.

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

Создание ссылок в PHP

В PHP есть две встроенные функции, позволяющие создавать жесткие и символические ссылки. Они принимают одни и те же строковые параметры и возвращают аналогичные результаты. Функция symlink() создает символическую ссылку. В первом параметре ей необходимо передать имя целевого файла, а во втором — место расположения ссылки. Функция вернет логическое значение true в случае успешного завершения, и false, если произошла ошибка. link() в свою очередь отвечает за создание жестких ссылок. Её использование аналогично предыдущей функции.

//Cоздаем символическую ссылку на файл пользователя
$targetFile = '/home/some-user/important-document.txt';
$linkFile = '/home/another-user/sym-link-document.txt';

if (file_exists($targetFile)) {
    if (symlink($targetFile, $linkFile)) {
        echo 'Символическая ссылка успешно создана';
    } else {
        echo 'Возможно нехватает прав доступа';
    }

} else {
    echo 'Целевой файл не существует';
}


//аналогичная операция для создания жесткой ссылки
$linkFile = '/home/another-user/hard-link-document.txt';
if (file_exists($targetFile)) {
    if (link($targetFile, $linkFile)) {
        echo 'Жесткая ссылка успешно создана';
    } else {
        echo 'Возможно нехватает прав доступа';
    }

} else {
    echo 'Целевой файл не существует';
}

Получение имени реального файла

Символические ссылки указывают на реальные файлы, присутствующие где-то в системе. Иногда требуется узнать место расположения целевого файла символической ссылки. Для этого в PHP используется функция readlink(). Она принимает всего один параметр строкового типа — место расположения ссылки. Функция вернет строку, с путем нахождения реального файла либо false в случае ошибки.

//создадим файл в корне сайта и установим на него ссылку
$targetFile = $_SERVER['DOCUMENT_ROOT']. '/real-file.txt';
$linkFile = $_SERVER['DOCUMENT_ROOT']. '/test-link.txt';

touch($targetFile);
if (symlink($targetFile, $linkFile)) {
    echo "Символическая ссылка {$linkFile} успешно создана<br>";
    echo 'Она указывает на файл: '. readlink($linkFile);
}

Распознавание различных ссылок

Иногда требуется узнать, указывает ли путь, записанный в строке, на реальный файл или ссылку. PHP имеет встроенные инструменты и на этот случай. Распознавание ссылок происходит через функцию is_link(). Она принимает всего один параметр строкового типа - место расположения файла. Если по указанному пути находится ссылка, функция вернет значение true, в противном случае, а также при возникновении ошибок, будет возвращено false.

//создадим файл в корне сайта и установим на него ссылку
$targetFile = $_SERVER['DOCUMENT_ROOT']. '/real-file.txt';
$linkFile = $_SERVER['DOCUMENT_ROOT']. '/test-link.txt';

touch($targetFile);
if (symlink($targetFile, $linkFile)) {
    echo "Символическая ссылка {$linkFile} успешно создана<br>";
}

//Затем проверим какой путь на что указывает
if (is_link($targetFile) !== true) {
    echo "Файл {$targetFile} является настоящим<br>";
}

if (is_link($linkFile) === true) {
    echo "Файл {$linkFile} является ссылкой<br>";
}

Последние публикации