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 и возвращает булево значение, которое всегда следует проверять.