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

Использование chgrp для изменения владельца группы
Раздел: Работа с файловой системой
chgrp(string $filename, string|int $group): bool
Функция chgrp

Функция chgrp изменяет группу-владельца указанного файла или директории в операционных системах на базе Unix/Linux. Она используется для управления правами доступа в файловой системе, когда необходимо предоставить доступ к файлу другой группе пользователей.

Аргументы функции

Функция имеет следующую сигнатуру:

bool chgrp(string $filename, string|int $group)
  • filename (строка, обязательный): Путь к файлу или директории.
  • group (строка или целое число, обязательный): Имя группы или её числовой идентификатор (GID).

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

Примеры использования chgrp
Изменение группы по имени
<?php
$file = 'test.txt';
if (chgrp($file, 'www-data')) {
    echo "Группа файла изменена на www-data.";
} else {
    echo "Не удалось изменить группу.";
}
?>
Группа файла изменена на www-data. // при успехе
Изменение группы по GID
<?php
$file = 'test.txt';
// Предположим, GID группы www-data равен 33
if (chgrp($file, 33)) {
    echo "Группа файла изменена по GID 33.";
}
?>
Группа файла изменена по GID 33.
Обработка ошибки
<?php
$file = 'несуществующий_файл.txt';
if (@chgrp($file, 'www-data')) {
    echo "Группа изменена.";
} else {
    echo "Ошибка изменения группы.";
}
?>
Ошибка изменения группы.
Похожие функции в PHP
  • chown(): Изменяет владельца файла. Применяется, когда нужно сменить пользователя-владельца, а не группу.
  • chmod(): Изменяет права доступа к файлу. Используется для настройки разрешений чтения, записи и выполнения.
  • lchgrp(): Меняет группу для символьной ссылки, а не для целевого файла. Актуально для работы с ссылками.

Функции chmod, chown и chgrp часто применяются вместе для комплексного управления доступом.

Аналоги в других языках

Chgrp в Python

Используется модуль os с функциями chown() (может менять и группу) или lchown().

import os
import pwd
gr = pwd.getpwnam('www-data').pw_gid
os.chown('test.txt', -1, gr) # -1 оставляет владельца без изменений
print("Группа изменена")
JavaScript (Node.js)

Применяется метод chown из модуля fs.

const fs = require('fs');
fs.chown('test.txt', null, 33, (err) => { // null оставляет владельца
    if (err) throw err;
    console.log('Группа изменена');
});

Chgrp в MySQL

Прямого аналога нет, так как СУБД работает с данными, а не с файлами файловой системы. Однако есть команда chown в shell.

# Команда в shell
chgrp www-data test.txt
Типичные ошибки
Недостаточно прав
<?php
$file = '/etc/passwd';
$result = @chgrp($file, 'www-data');
var_dump($result); // bool(false)
?>
bool(false)
Несуществующая группа
<?php
$file = 'test.txt';
$result = @chgrp($file, 'неизвестная_группа');
var_dump($result); // bool(false)
?>
bool(false)
Несуществующий файл
<?php
$file = 'missing.txt';
$result = @chgrp($file, 'www-data');
var_dump($result);
?>
bool(false)

Для отлова ошибок можно использовать оператор контроля ошибок @ или проверять существование файла и группы перед вызовом функции.

Изменения в версиях PHP

В PHP 8.0.0 параметр group стал принимать как строку, так и целое число. Ранее допускался только строковый тип. Это изменение упрощает использование числового GID.

<?php
// Работает в PHP 8+
chgrp('file.txt', 1001); // GID как integer
chgrp('file.txt', 'users'); // Имя группы как string
?>
Расширенные примеры
Рекурсивное изменение группы для директории
Пример php
<?php
function chgrpRecursive($dir, $group) {
    $items = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::SELF_FIRST
    );
    foreach ($items as $item) {
        if ($item->isLink()) {
            continue; // Пропускаем символьные ссылки
        }
        if (@chgrp($item->getPathname(), $group)) {
            echo "Группа для: " . $item->getPathname() . " изменена.<br>";
        }
    }
}
chgrpRecursive('./project', 'www-data');
?>
Изменение группы с проверкой существования группы
Пример php
<?php
function getGroupId($groupName) {
    $groupInfo = posix_getgrnam($groupName);
    return $groupInfo ? $groupInfo['gid'] : false;
}
$file = 'data.log';
$groupName = 'www-data';
$gid = getGroupId($groupName);
if ($gid !== false) {
    chgrp($file, $gid); // Используем числовой GID
    echo "Группа установлена.";
} else {
    echo "Группа $groupName не найдена.";
}
?>
Использование с символическими ссылками
Пример php
<?php
$target = 'original.txt';
$link = 'link_to_original.txt';
symlink($target, $link);
// chgrp() изменит группу целевого файла, а не ссылки
chgrp($link, 'www-data');
echo "Группа изменена для целевого файла.";
// Для изменения группы самой ссылки нужна lchgrp()
if (function_exists('lchgrp')) {
    lchgrp($link, 'staff');
}
?>
Обработка нескольких файлов
Пример php
<?php
$files = ['a.txt', 'b.txt', 'c.txt'];
$results = [];
foreach ($files as $file) {
    if (file_exists($file)) {
        $results[$file] = chgrp($file, 'www-data');
    }
}
print_r($results);
?>
Array
(
    [a.txt] => 1
    [b.txt] => 1
    [c.txt] => 1
)

PHP chgrp function comments

En
Chgrp Changes file group