W3docs

filegroup()

Функция filegroup() возвращает числовой идентификатор группы файла в PHP. Узнайте синтаксис, обработку ошибок и практические примеры использования.

Функция filegroup() возвращает идентификатор группы владельца файла. В Unix-подобных системах каждый файл принадлежит пользователю и группе; filegroup() возвращает числовой идентификатор этой группы. В данной главе рассматривается синтаксис функции, возвращаемое значение, способ преобразования числового идентификатора в имя группы, распространённые подводные камни и место функции среди других PHP-функций для инспекции файлов.

Синтаксис

filegroup(string $filename): int|false

$filename — путь к файлу (или директории) для проверки. В случае успеха функция возвращает идентификатор группы в виде целого числа. В случае ошибки она возвращает false.

Несколько важных вещей:

  • Идентификатор группы — это число, а не имя. На большинстве систем 0 соответствует группе root/wheel, однако точное соответствие зависит от конкретной системы.
  • Результат кэшируется. PHP кэширует данные stat() для каждого файла, поэтому если группа файла изменится во время выполнения скрипта, может потребоваться вызов clearstatcache() для получения нового значения.
  • В Windows концепция группы файлов неприменима, и filegroup() там лишена смысла.

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

<?php

$filename = __FILE__; // the script file itself — guaranteed to exist
$groupId = filegroup($filename);

echo "The group ID of $filename is $groupId";

Использование __FILE__ гарантирует существование пути, поэтому пример воспроизводим. Вывод представляет собой число, например:

The group ID of /var/www/example.php is 33

Преобразование идентификатора в имя группы

Вывод необработанного числа редко бывает удобным. В системах с расширением POSIX можно преобразовать его в читаемое имя с помощью posix_getgrgid():

<?php

$groupId = filegroup(__FILE__);

if ($groupId === false) {
    echo "Could not read the file group.";
} elseif (function_exists('posix_getgrgid')) {
    $group = posix_getgrgid($groupId);
    echo "Group name: " . $group['name']; // e.g. "www-data"
} else {
    echo "Group ID: $groupId";
}

Примечание: posix_getgrgid() является частью расширения POSIX и недоступна в Windows. Всегда проверяйте наличие функции с помощью function_exists(), если ваш код может выполняться на разных платформах.

Обработка ошибок

Когда файл не существует или к нему нет доступа, filegroup() возвращает false и генерирует предупреждение E_WARNING. Поскольку false можно спутать с 0 (допустимый идентификатор группы root), всегда используйте строгий оператор === при сравнении:

<?php

$result = filegroup('does-not-exist.txt');

if ($result === false) {
    echo "Unable to determine the file group.";
} else {
    echo "Group ID: $result";
}

Чтобы подавить предупреждение в случаях, когда отсутствие файла ожидаемо, сначала проверьте его существование с помощью file_exists(), вместо того чтобы заглушать предупреждение оператором @.

Когда это использовать?

filegroup() полезна, когда нужно проверить или подтвердить владельца файла — например, убедиться, что загруженные файлы или сгенерированные файлы кэша принадлежат группе веб-сервера (обычно www-data), чтобы сервер мог их читать и записывать. Функция часто используется в паре с:

  • fileowner() — числовой идентификатор пользователя-владельца файла.
  • fileperms() — биты прав доступа к файлу.
  • filetype() — тип файла: обычный файл, директория, символическая ссылка и т. д.
  • stat() — все вышеперечисленные сведения (и не только) в одном вызове.

Заключение

filegroup() возвращает числовой идентификатор группы файла или false в случае ошибки. Сочетайте её с posix_getgrgid() для отображения читаемого имени группы, всегда сравнивайте результат с помощью ===, чтобы отличить ошибку от допустимого значения 0, и не забывайте о clearstatcache(), когда владелец файла может измениться в процессе выполнения скрипта. Для получения полной информации о метаданных файла используйте fileowner(), fileperms() и stat().

Практика

Практика
Что возвращает filegroup(), если файл не существует?
Что возвращает filegroup(), если файл не существует?
Was this page helpful?