chgrp()
Функция chgrp() в PHP меняет группу файла или директории. Синтаксис, параметры, возвращаемые значения и примеры использования.
Введение
В Unix-подобных системах каждый файл принадлежит пользователю (владельцу) и группе. Группа позволяет нескольким учётным записям совместно использовать один файл через биты группового доступа. Функция chgrp() в PHP изменяет группу файла или директории — ту же задачу, что выполняет команда оболочки chgrp, но вызываемую из кода.
Это чаще всего требуется, когда скрипт создаёт файлы, к которым должны также иметь доступ веб-сервер, пользователь деплоя или фоновый воркер: вы задаёте группу, чтобы все эти учётные записи (входящие в данную общую группу) могли работать с файлом.
В статье рассматриваются синтаксис, параметры, возвращаемое значение, типичные подводные камни и запускаемые примеры, в том числе как изменить группу для целого дерева директорий.
chgrp()работает только на Unix-подобных системах (Linux, macOS, BSD). На Windows она ничего не делает и возвращаетtrue. Это функция-«сестра»chown()(меняет владельца) иchmod()(меняет биты прав доступа).
Синтаксис
chgrp(string $filename, string|int $group): bool$filename— путь к файлу или директории, для которых меняется группа.$group— новая группа, задаётся либо как имя группы (например,"www-data"), либо как числовой идентификатор группы / GID (например,33).
Параметры
| Параметр | Обязательный | Описание |
|---|---|---|
$filename | Да | Путь к файлу или директории для изменения. |
$group | Да | Целевая группа. Значение типа string интерпретируется как имя группы; значение типа int — как числовой GID. |
Передача GID удобна в тех случаях, когда имя группы может не разрешиться на текущем хосте, но числовой идентификатор гарантированно стабилен.
Возвращаемые значения
chgrp() возвращает boolean:
true— группа успешно изменена (или платформа — Windows, где вызов является холостым).false— изменение не выполнено, как правило из-за недостаточных прав или отсутствия группы/файла. При этом также выдаётся предупреждение.
Поскольку возвращаемое значение само по себе не говорит о причине ошибки, всегда проверяйте его явно, а не игнорируйте.
Примеры
Изменение группы одного файла
<?php
$filename = "/path/to/file.txt";
$group = "www-data";
if (chgrp($filename, $group)) {
echo "Group ownership changed to {$group}.";
} else {
echo "Failed to change group ownership.";
}Чтение группы после её изменения
Чтобы убедиться в успешном изменении, получите группу с помощью filegroup(), которая возвращает GID файла. Кеш, который используют функции stat, может устареть сразу после изменения, поэтому предварительно очистите его с помощью clearstatcache():
<?php
$filename = "/path/to/file.txt";
chgrp($filename, "www-data");
clearstatcache(); // forget any cached stat info for the file
$gid = filegroup($filename); // numeric group ID
// On systems with the POSIX extension you can turn the GID into a name:
if (function_exists("posix_getgrgid")) {
$info = posix_getgrgid($gid);
echo "File now belongs to group: " . $info["name"];
} else {
echo "File now belongs to GID: " . $gid;
}Изменение группы для всего дерева директорий (рекурсивно)
chgrp() не работает рекурсивно, поэтому для изменения каждого файла внутри директории нужно итерироваться вручную. RecursiveDirectoryIterator делает это лаконичным:
<?php
function chgrpRecursive(string $path, string|int $group): bool
{
$ok = chgrp($path, $group);
if (is_dir($path)) {
$items = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($items as $item) {
$ok = chgrp($item->getPathname(), $group) && $ok;
}
}
return $ok;
}
if (chgrpRecursive("/var/www/uploads", "www-data")) {
echo "Whole tree updated.";
} else {
echo "At least one path could not be changed.";
}Типичные подводные камни
- Права доступа. Изменить группу файла может только его владелец (при условии, что он входит в целевую группу) или суперпользователь. Типичный веб-запрос, выполняющийся от имени
www-data, не может произвольно переназначать группы файлов, поэтому в среде shared-хостинга это часто завершается неудачей без видимых признаков — всегда проверяйте возвращаемое значение. - Символические ссылки.
chgrp()следует по символическим ссылкам и изменяет группу целевого файла. Чтобы изменить группу самой ссылки, используйте поведение семействаlchown()(lchgrpв PHP недоступна, поэтому при необходимости работайте с путём ссылки средствами ОС). - Устаревший кеш stat. PHP кеширует метаданные файлов; после вызова
chgrp()вызовитеclearstatcache()перед повторным чтением группы, иначе может отображаться старое значение. - Без раскрытия glob.
chgrp("uploads/*", ...)не работает — передавайте реальный путь и самостоятельно перебирайте совпадения изglob().
Связанные функции
chown()— изменить владельца файла.chmod()— изменить биты прав доступа.filegroup()— получить текущую группу файла (GID).clearstatcache()— сбросить кеш метаданных файла.
Заключение
chgrp() предоставляет PHP прямой способ управлять тем, какая группа владеет файлом или директорией — что является ключом к совместному доступу нескольких Unix-учётных записей. Помните, что функция требует достаточных привилегий, не выполняет рекурсию самостоятельно и что перед повторным чтением результата необходимо очищать кеш stat. Используйте её вместе с chown() и chmod(), когда требуется полный контроль над владением и правами доступа.