权限概念是 Unix/Linux 文件系统的核心。这些权限决定了谁可以访问文件以及如何访问文件。Linux 的文件权限由 chmod 命令操作,该命令可以在 Linux 终端中运行。PHP 提供了 chmod() 函数,您可以使用该函数以编程方式处理文件权限。
PHP chmod() 函数仅在您在 Linux 操作系统上工作时有效。它不适用于 Windows,因为 Windows 操作系统具有不同的文件权限控制机制。
要查看对文件启用的权限,请使用 “ls -l” 命令获取文件列表(长列表)
mvl@GNVBGL3:~$ ls -l
-rwxr-xr-x 1 mvl mvl 16376 May 5 21:52 a.out
-rw-r--r-- 1 mvl mvl 83 May 5 21:52 hello.cpp
-rwxr-xr-x 1 mvl mvl 43 Oct 11 14:50 hello.php
-rwxr-xr-x 1 mvl mvl 43 May 8 10:01 hello.py
drwxr-xr-x 5 mvl mvl 4096 Apr 20 21:52 myenv
第一列包含每个文件的权限标志。第 3 列和第 4 列表示每个文件的所有者和组,后跟大小、日期和时间以及文件名。
权限字符串有 10 个字符,其含义描述如下 -
位置 | 描述 |
---|---|
1 | 如果是目录,则为 “d”,如果是普通文件,则为 “-” |
2, 3, 4 | 文件用户(所有者)的读取、写入、执行权限 |
5, 6, 7 | 组的读取、写入、执行权限 |
8, 9, 10 | 其他 (world) 的 Read, write, execute 权限 |
权限字符串中的字符具有以下含义 -
值 | 描述 |
---|---|
- | Flag 未设置。 |
r | 文件可读。 |
w | 文件是可写的。对于目录,可以创建或删除文件。 |
x | 文件是可执行的。对于目录,可能会列出文件。 |
如果您考虑上述列表中的第一个条目 -
-rwxr-xr-x 1 mvl mvl 16376 May 5 21:52 a.out
“a.out” 文件由用户 “mvl” 和组 “mvl” 拥有。它是一个普通文件,所有者具有 “read/write/execute” 权限,组和其他组具有 “read/execute” 权限。
权限标志的二进制和八进制表示形式可以通过下表来理解 -
八进制 | 二进制表示 (rwx) | 许可 |
---|---|---|
0 | 000 | none |
1 | 001 | 仅执行 |
2 | 010 | 只写 |
3 | 011 | 写入和执行 |
4 | 100 | 只读 |
5 | 101 | 读取和执行 |
6 | 110 | 读取和写入 |
7 | 111 | 读取、写入和执行(完全权限) |
chmod() 函数
chmod() 函数可以更改指定文件的权限。成功时返回 true,失败时返回 false。
chmod(string $filename, int $permissions): bool
chmod() 函数尝试将指定文件 ( $filename ) 的模式更改为 许可给定模式。
第二个参数 $permissions 是具有四个八进制数字的八进制数。第一个数字始终为零,第二个数字指定所有者的权限,第三个数字指定所有者的用户组的权限,第四个数字指定其他所有人的权限。每个数字是每种权限类型的值之和。
1 | 执行权限 |
2 | 写入权限 |
4 | 读取权限 |
$permissions 参数的默认值为 0777,这意味着在启用执行、写入和读取权限的情况下创建目录。
例子
请看下面的例子 -
<?php
// 所有者读写,everybody不能读写
chmod("/PhpProject/sample.txt", 0600);
// 所有者读写,everybody只读
chmod("/PhpProject/sample.txt", 0644);
// 所有者全部权限,everybody只读和执行
chmod("/PhpProject/sample.txt", 0755);
// 所有者可以读写,组内成员可以读
chmod("/PhpProject/sample.txt", 0740);
?>
chown() 函数
chown() 函数尝试将文件文件名的所有者更改为新用户。请注意,只有 超级用户 才能更改文件的所有者。
chown(string $filename, string|int $user): bool
例子
请看下面的例子 -
<?php
// 要使用的文件名和用户名
$file_name= "index.php";
$path = "/PhpProject/backup: " . $file_name ;
$user_name = "root";
// 设置用户
chown($path, $user_name);
// 检查结果
$stat = stat($path);
print_r(posix_getpwuid(fileowner($path)));
?>
chgrp() 函数
chgrp() 函数尝试将文件文件名的组更改为 group。
chgrp(string $filename, string|int $group): bool
只有 超级用户 才能任意更改文件的组,其他用户可以将文件的组更改为该用户所属的任何组。
例子
请看下面的例子 -
<?php
$filename = "/PhpProject/sample.txt";
$format = "%s's Group ID @ %s: %d\n";
printf($format, $filename, date('r'), filegroup($filename));
chgrp($filename, "admin");
clearstatcache(); // 不缓存filegroup()结果
printf($format, $filename, date('r'), filegroup($filename));
?>
它将产生以下输出 -
/PhpProject/sample.txt's Group ID @ Fri, 13 Oct 2023 07:42:21 +0200: 0