lchgrp()
Функция lchgrp() в PHP изменяет группу символической ссылки, не затрагивая целевой файл. Синтаксис, параметры и примеры.
Функция PHP lchgrp() изменяет групповую принадлежность самой символической ссылки, а не файла, на который она указывает. На этой странице объясняется, что она делает, чем отличается от chgrp(), какие параметры принимает, что возвращает, а также правила разрешений и платформ, определяющие успех вызова.
Что такое функция lchgrp()?
Символическая ссылка (симлинк) — это небольшой файл, указывающий на другой путь. Большинство функций файловой системы «следуют» за ссылкой и работают с целевым объектом. lchgrp() является исключением: префикс l означает, что функция действует на узел самой ссылки, не затрагивая группу цели.
Это важно, когда ссылка и её цель принадлежат разным группам, или когда нужно управлять разрешениями ссылки, не изменяя файл, на который она ссылается. Для аналога, работающего с владельцем, см. lchown(); для версии, следующей за ссылкой, см. chgrp().
Синтаксис
lchgrp(string $filename, string|int $group): bool| Параметр | Описание |
|---|---|
$filename | Путь к символической ссылке, группу которой нужно изменить. |
$group | Новая группа — указывается как имя группы ('staff') или числовой GID (20). |
Функция возвращает true при успехе и false при ошибке. В случае ошибки PHP также генерирует предупреждение E_WARNING.
Как использовать lchgrp()
Передайте путь к ссылке и целевую группу, затем проверьте булев результат:
<?php
$link = __DIR__ . '/data-current'; // a symlink, e.g. -> data-2026
$group = 'staff';
if (lchgrp($link, $group)) {
echo "Link group changed to {$group}.";
} else {
echo 'Could not change the link group.';
}Поскольку lchgrp() воздействует на ссылку, группа файла data-2026 не изменяется — меняется только символическая ссылка data-current.
lchgrp() vs chgrp()
Обе функции имеют одинаковую сигнатуру, но работают с разными объектами:
<?php
// Acts on the LINK only:
lchgrp('/var/www/current', 'www-data');
// Follows the link and acts on the TARGET file/directory:
chgrp('/var/www/current', 'www-data');Используйте lchgrp(), когда необходимо изменить метаданные именно символической ссылки и при этом оставить владельца целевого файла нетронутым.
Возвращаемое значение, разрешения и платформы
Возврат true означает, что изменение применено. Несколько условий приводят к возврату false (с предупреждением):
- Разрешения. Изменить группу ссылки может только её владелец (или суперпользователь), причём пользователь должен быть членом целевой группы. На большинстве систем это означает, что скрипту фактически требуется доступ
root. - Путь должен быть симлинком. Если
$filenameявляется обычным файлом или не существует, вызов завершится с ошибкой. - Windows. Групповая принадлежность — концепция POSIX, поэтому
lchgrp()не поддерживается в Windows в значимом смысле.
Поскольку ошибки часты в общих окружениях, всегда проверяйте возвращаемое значение, не предполагая успех. Для проверки ссылки перед изменением полезны is_link() и readlink().
<?php
$link = '/var/www/current';
if (!is_link($link)) {
echo "{$link} is not a symbolic link.";
} elseif (lchgrp($link, 'www-data')) {
echo 'Group updated.';
} else {
echo 'Update failed — check ownership and group membership.';
}Заключение
lchgrp() изменяет группу символической ссылки, не следуя к цели — симлинк-ориентированный аналог chgrp() и групповой эквивалент lchown(). Функция возвращает true или false, требует соответствующих прав на владение и членства в группе и не работает на Windows. Всегда проверяйте возвращаемое значение и убедитесь, что путь является ссылкой с помощью is_link() перед использованием результата.