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().