PHP – 文件权限



权限的概念是 Unix/Linux 文件系统的核心。权限决定了谁可以访问文件以及如何访问文件。Linux 中的文件权限由chmod 命令操作,该命令可以在 Linux 终端中运行。PHP 提供了chmod() 函数,您可以用它以编程方式处理文件权限。

只有在 Linux 操作系统上工作时,PHP 的 chmod() 函数才有效。它在 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

第一列包含每个文件的权限标志。第三列和第四列分别指示每个文件的拥有者和组,后面跟着大小、日期和时间以及文件名。

权限字符串包含十个字符,其含义如下:

位置 含义
1 如果为目录则为“d”,如果为普通文件则为“-”
2, 3, 4 文件拥有者(用户)的读、写、执行权限
5, 6, 7 组的读、写、执行权限
8, 9, 10 其他用户的读、写、执行权限

权限字符串中的字符具有以下含义:

含义
- 标志未设置。
r 文件可读。
w 文件可写。对于目录,可以创建或删除文件。
x 文件可执行。对于目录,可以列出文件。

如果您考虑上述列表中的第一个条目:

-rwxr-xr-x 1 mvl mvl 16376 May  5 21:52 a.out

"a.out" 文件由用户 "mvl" 和组 "mvl" 拥有。它是一个普通文件,拥有者具有“读/写/执行”权限,组和其他人具有“读/执行”权限。

权限标志的二进制和八进制表示可以通过下表理解:

八进制数字 二进制表示 (rwx) 权限
0 000
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 中给定的模式。

第二个参数$permissions是一个具有四个八进制数字的八进制数。第一位始终为零,第二位指定拥有者的权限,第三位指定拥有者的用户组的权限,第四位指定其他所有人的权限。每一位都是每种权限值的总和。

1 执行权限
2 写入权限
4 读取权限

$permissions参数的默认值为0777,这意味着目录以启用执行、写入和读取权限的方式创建。

示例

请看下面的例子:

<?php

   // Read and write for owner, nothing for everybody else
   chmod("/PhpProject/sample.txt", 0600);

   // Read and write for owner, read for everybody else
   chmod("/PhpProject/sample.txt", 0644);

   // Everything for owner, read and execute for everybody else
   chmod("/PhpProject/sample.txt", 0755);

   // Everything for owner, read for owner's group
   chmod("/PhpProject/sample.txt", 0740);
?>

chown() 函数

chown() 函数尝试将文件 filename 的所有者更改为新用户。请注意,只有超级用户才能更改文件的所有者。

chown(string $filename, string|int $user): bool

示例

请看下面的例子:

<?php

   // File name and username to use
   $file_name= "index.php";
   $path = "/PhpProject/backup: " . $file_name ;
   $user_name = "root";

   // Set the user
   chown($path, $user_name);

   // Check the result
   $stat = stat($path);
   print_r(posix_getpwuid(fileowner($path)));
?>

chgrp() 函数

chgrp() 函数尝试将文件 filename 的组更改为 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();  	// do not cache filegroup() results
   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
广告