Symlink: примеры (PHP)

Практическое применение symlink для работы с файлами
Раздел: Работа с файловой системой
symlink(string target, string link): bool
Описание функции symlink в PHP

Функция symlink создает символическую ссылку (симлинк) для указанного целевого файла или директории.

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

Синтаксис и параметры
bool symlink ( string $target , string $link )

Функция принимает два обязательных строковых аргумента и возвращает true при успешном выполнении или false при ошибке.

  • $target (строка): Путь к исходному файлу или директории, на который будет ссылаться симлинк. Этот путь может быть абсолютным или относительным.
  • $link (строка): Путь, по которому будет создана новая символическая ссылка.
Примеры использования symlink
Создание простой символической ссылки
$target = '/var/www/project/config.ini';
$link = '/etc/config.ini';

if (symlink($target, $link)) {
    echo 'Симлинк успешно создан.';
} else {
    echo 'Ошибка при создании симлинка.';
}
Симлинк успешно создан.
Создание ссылки на директорию
$result = symlink('/home/user/uploads', '/var/www/html/storage');
var_dump($result);
bool(true)
Использование относительных путей
// Создание симлинка 'link.php' на файл '../source.php' относительно текущей директории
$success = symlink('../source.php', 'link.php');
echo $success ? 'Успех' : 'Неудача';
Успех
Похожие функции в PHP
  • link(): Создает жесткую ссылку (hard link). В отличие от симлинков, жесткие ссылки не могут указывать на директории и работают только в пределах одной файловой системы.
  • readlink(): Возвращает цель символической ссылки. Полезна для проверки и чтения существующих симлинков.
  • linkinfo(): Получает информацию о ссылке, например, проверяет ее существование.

Функцию symlink предпочтительнее использовать для создания ссылок на директории или для переносимых ссылок между разделами файловой системы. Жесткие ссылки лучше подходят для экономии места при множественных ссылках на один файл в пределах одного раздела.

Распространенные ошибки
Попытка создания симлинка в несуществующей директории
$result = symlink('/tmp/file.txt', '/nonexistent/link.txt');
var_dump($result); // false
var_dump(error_get_last()['message']);
bool(false)
string(53) "symlink(): No such file or directory"
Создание симлинка с уже существующим именем
file_put_contents('existing.txt', 'test');
$result = symlink('/tmp/target.txt', 'existing.txt');
var_dump($result);
bool(false)

В этом случае функция вернет false, так как файл с таким именем уже существует.

Отсутствие прав на запись
$result = @symlink('/etc/passwd', '/root/link');
if ($result === false) {
    echo 'Ошибка: недостаточно прав.';
}
Ошибка: недостаточно прав.
Изменения в последних версиях PHP

Начиная с PHP 7.1.0, функция symlink() на платформах Windows теперь поддерживает относительные пути и ссылки на директории.

В PHP 8.0.0 не было внесено значительных изменений в поведение функции symlink, однако всегда рекомендуется проверять права доступа и существование целевых путей, так как обработка ошибок может зависеть от операционной системы.

Расширенные примеры использования
Создание резервной копии через симлинки
Пример php
$backupDir = '/backups/' . date('Y-m-d');
if (!is_dir($backupDir)) {
    mkdir($backupDir, 0755, true);
}
// Создание симлинка на актуальную конфигурацию в папке с резервной копией
symlink('/etc/app/config.ini', $backupDir . '/config.ini.link');
echo 'Симлинк для резервной копии создан.';
Симлинк для резервной копии создан.
Переключение версий приложения
Пример php
$currentVersion = 'v2.1.5';
$versions = ['v2.1.4', 'v2.1.5', 'v2.2.0-beta'];
$webRoot = '/var/www/html';

if (is_link($webRoot . '/current')) {
    unlink($webRoot . '/current'); // Удаляем старый симлинк
}
symlink($webRoot . '/' . $currentVersion, $webRoot . '/current');
echo 'Активная версия изменена на ' . $currentVersion;
Активная версия изменена на v2.1.5
Обработка относительных симлинков для портативности
Пример php
// Создание относительного симлинка
$relativePath = '../shared/logs/app.log';
$linkName = 'current.log';
if (symlink($relativePath, $linkName)) {
    $resolved = readlink($linkName);
    echo 'Создан относительный симлинк: ' . $resolved;
}
Создан относительный симлинк: ../shared/logs/app.log
Альтернативы в других языках

Symlink в Python

import os
target = '/path/to/target'
link = '/path/to/link'
# Создание символической ссылки
os.symlink(target, link)
print('Ссылка создана')
Ссылка создана
JavaScript (Node.js)
const fs = require('fs');
fs.symlink('target.txt', 'link.txt', (err) => {
    if (err) throw err;
    console.log('Симлинк создан');
});
Симлинк создан
Bash/Shell
ln -s /target/path /link/path

Отличие PHP-функции в том, что она является частью стандартной библиотеки и работает синхронно, в отличие от асинхронных вариантов в Node.js.

PHP symlink function comments

En
Symlink Creates a symbolic link