PHP – 文件权限


权限概念是 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
/PhpProject/sample.txt's Group ID @ Fri, 13 Oct 2023 07:42:21 +0200: 0