PHP chgrp() 函数

说明: chgrp() 函数改变指定文件所属的用户组。

语法

bool chgrp ( string $filename , mixed $group )

参数说明

参数 描述
filename 必需。要改变组别的文件路径
group 必需。组名或组的ID(GID)

返回值

  • 成功时返回 TRUE
  • 失败时返回 FALSE

注意事项

  • 只有超级用户(root)可以任意修改文件的组属性
  • 普通用户只能将文件的组修改为自己所在的组
  • Windows 系统中此函数不适用
  • 需要相应的文件系统权限

示例

示例 1:基本使用

<?php
// 将文件组改为 www-data
$filename = "test.txt";
$group = "www-data";

if (chgrp($filename, $group)) {
    echo "文件组已成功修改为 $group";
} else {
    echo "文件组修改失败";
}
?>

示例 2:使用组ID(GID)

<?php
// 使用组ID来修改文件组
$filename = "data.log";
$gid = 33; // 通常 www-data 组的GID是33

if (chgrp($filename, $gid)) {
    echo "文件组已成功修改,GID: $gid";
} else {
    echo "文件组修改失败";
}
?>

示例 3:获取当前文件组信息

<?php
$filename = "example.php";

// 获取文件组信息
$filegroup = filegroup($filename);
$grouparray = posix_getgrgid($filegroup);
$groupname = $grouparray['name'];

echo "当前文件组:$groupname (GID: $filegroup)";

// 修改文件组
$newgroup = "developers";
if (chgrp($filename, $newgroup)) {
    echo "\n文件组已修改为:$newgroup";

    // 验证修改结果
    clearstatcache();
    $newgid = filegroup($filename);
    $newgrouparray = posix_getgrgid($newgid);
    echo "\n验证 - 新组名:" . $newgrouparray['name'];
}
?>

示例 4:批量修改文件组

<?php
/**
 * 批量修改目录下所有文件的组
 */
function batch_chgrp($directory, $group) {
    if (!is_dir($directory)) {
        return false;
    }

    $files = scandir($directory);
    $success_count = 0;
    $fail_count = 0;

    foreach ($files as $file) {
        if ($file == '.' || $file == '..') {
            continue;
        }

        $filepath = $directory . '/' . $file;

        if (is_file($filepath)) {
            if (chgrp($filepath, $group)) {
                $success_count++;
            } else {
                $fail_count++;
            }
        }
    }

    return [
        'success' => $success_count,
        'fail' => $fail_count
    ];
}

// 使用示例
$result = batch_chgrp('/var/www/html/uploads', 'www-data');
if ($result) {
    echo "成功修改: {$result['success']} 个文件\n";
    echo "失败: {$result['fail']} 个文件";
}
?>

错误处理示例

<?php
$filename = "important.txt";
$group = "admin";

// 错误处理
try {
    if (!file_exists($filename)) {
        throw new Exception("文件不存在: $filename");
    }

    if (!is_writable($filename)) {
        throw new Exception("文件不可写: $filename");
    }

    // 检查当前用户权限
    $current_uid = posix_getuid();
    $file_owner = fileowner($filename);

    if ($current_uid != 0 && $current_uid != $file_owner) {
        throw new Exception("权限不足:只有文件所有者或root用户可以修改组属性");
    }

    // 尝试修改组
    if (chgrp($filename, $group)) {
        echo "文件组修改成功";
    } else {
        $error = error_get_last();
        throw new Exception("chgrp() 执行失败: " . $error['message']);
    }
} catch (Exception $e) {
    echo "错误: " . $e->getMessage();
    error_log("chgrp error: " . $e->getMessage());
}
?>

相关函数

使用建议
  1. 在生产环境中使用前,先在测试环境验证
  2. 修改系统文件前做好备份
  3. 使用 clearstatcache() 清除文件状态缓存
  4. 考虑使用 is_writable() 检查文件权限
  5. 对于批量操作,添加适当的错误处理和日志记录