W3docs

lchown()

PHP lchown() меняет владельца символической ссылки, не следуя к цели. Синтаксис, возвращаемое значение, отличия от chown() и правила прав доступа.

Функция PHP lchown() изменяет владельца самой символической ссылки, не следуя по ней к целевому файлу. На этой странице объясняется, что она делает, чем отличается от chown(), приводится точная сигнатура и возвращаемое значение, а также рассматриваются правила прав доступа, определяющие успех или неудачу операции.

Что такое функция lchown()?

lchown() — встроенная функция PHP, задающая пользователя (владельца) символической ссылки. Префикс «l» означает, что функция работает со ссылкой, а не с файлом, на который она указывает — такое же соглашение используется в соответствующих вызовах библиотеки C (lchown vs chown).

Это различие важно только для символических ссылок. Символическая ссылка — небольшой файл, хранящий путь к другому файлу. Большинство операций с файловой системой разыменовывают символическую ссылку автоматически: если вызвать chown() для символической ссылки, изменится владелец целевого файла. lchown() — вариант, который останавливается на самой ссылке и изменяет её владельца.

lchown() является аналогом lchgrp() для управления пользователем-владельцем, тогда как lchgrp() изменяет группу символической ссылки.

Синтаксис

lchown(string $filename, string|int $user): bool
ПараметрОписание
$filenameПуть к символической ссылке, владельца которой нужно изменить.
$userНовый владелец — имя пользователя (string), например 'www-data', или числовой идентификатор пользователя (int), например 33.

Возвращаемое значение. lchown() возвращает true при успехе и false при неудаче (и генерирует предупреждение, например, когда не хватает прав или путь не существует).

Базовый пример

<?php

$link = '/path/to/link';
$user = 'myuser';

if (lchown($link, $user)) {
    echo 'Ownership of symbolic link updated successfully';
} else {
    echo 'Failed to update ownership of symbolic link';
}

Здесь владелец символической ссылки /path/to/link устанавливается как myuser. Конструкция if проверяет булев результат, чтобы можно было обработать ошибку, а не молча её игнорировать.

lchown() и chown(): в чём разница

Разница лучше всего видна, когда ссылка и целевой файл принадлежат разным владельцам. Предположим, report.txt — реальный файл, а latest — символическая ссылка на него:

<?php

$target = '/var/data/report.txt';
$link   = '/var/data/latest';      // symlink -> report.txt

// Changes the OWNER OF report.txt (chown follows the link):
chown($link, 'alice');

// Changes the OWNER OF the symlink "latest" only; report.txt is untouched:
lchown($link, 'bob');

Используйте lchown(), когда нужно изменить метаданные самой ссылки, не затрагивая — и случайно не меняя владельца — файла, на который она указывает. Использование chown() здесь стало бы ошибкой, если цель — изменить владельца именно ссылки.

Полный пример

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

<?php

$target = sys_get_temp_dir() . '/lchown_target.txt';
$link   = sys_get_temp_dir() . '/lchown_link';

file_put_contents($target, "hello\n");
@unlink($link);            // remove any leftover link from a previous run
symlink($target, $link);   // create the symbolic link

$me = posix_getpwuid(posix_geteuid())['name']; // current process user

if (lchown($link, $me)) {
    echo "Link owner set to: " . posix_getpwuid(lstat($link)['uid'])['name'] . "\n";
} else {
    echo "lchown() failed\n";
}

lstat() (а не stat()) используется для чтения собственных метаданных ссылки — по аналогии с тем, как lchown() их записывает.

Права доступа и особенности

  • Требуются привилегии. Изменение владельца элемента на другого пользователя обычно требует прав root. Обычный пользователь может, как правило, лишь «изменить» владельца на себя, что фактически не даёт никакого эффекта. В противном случае ожидайте false и предупреждение.
  • Windows. lchown() — операция в стиле POSIX и недоступна в Windows. Она предназначена для файловых систем, совместимых с Unix.
  • Путь должен быть символической ссылкой. Указание lchown() на обычный файл технически работает на уровне ОС, но вся суть функции — символические ссылки; для обычных файлов используйте chown().
  • Проверяйте, не подавляйте. Ошибки генерируют E_WARNING. Лучше проверять возвращаемое значение (как показано выше), а не заглушать предупреждения с помощью @ в надежде на лучшее.

Связанные функции

  • chown() — изменяет владельца файла (следует по символическим ссылкам).
  • lchgrp() — изменяет группу символической ссылки.
  • chgrp() — изменяет группу файла.
  • fileowner() — возвращает идентификатор пользователя-владельца файла.
  • symlink() — создаёт символическую ссылку.
  • readlink() — возвращает путь, на который указывает символическая ссылка.

Заключение

lchown() изменяет владельца самой символической ссылки, а не файла, на который она указывает — это ключевая причина выбрать её вместо chown(). Помните, что функция требует соответствующих привилегий, работает только в Unix и возвращает булево значение, которое всегда следует проверять.

Practice

Практика
What is the purpose of the lchown() function in PHP?
What is the purpose of the lchown() function in PHP?
Was this page helpful?