PHP : 为文件添加新权限

PHP : add new permission to a file

在我的服务器上,我有一些具有不同权限的文件。

在我的 php 脚本中,我想为每个文件添加 写入 的权限。

使用 linux 命令,chmod g+w file 完成工作。

但是如何使用 php chmod() 做到这一点?

这是我目前尝试的方法:

$filePermission = fileperms('myFile.txt');
# g+w = 020
chmod('myFile.txt', $filePermission+20);

这给了我想要的,但是 linux chmod g+wphp 替代方案吗?

语法 g+w 对 PHP 无效,大多数编程语言也无效,因为底层操作系统没有这些值的概念。 chmod 系统调用只接受八进制值,不接受字符串。在您的系统上,chmod 命令行可执行文件已实现解析器来实现此自定义功能。

虽然您的示例 "works",但如果文件已经具有 g+w,则会导致不良结果,因为再添加 20 将打开额外的位并授予文件您不想要的额外权限。例如,如果文件权限是 020 并且您向其添加 020,它将变为 040.

Posix 文件权限是八进制位,其中每个数字代表读取、写入和执行的组合。因此加法运算 (+) 是不正确的,您需要使用 ANDOR 等按位运算来打开或关闭各个位。对于 PHP、C、C++ 和大多数常见语言,AND 运算符是与符号 (&),而 OR 运算符是竖线符号 (|)。由于我们希望打开位,因此我们需要使用 OR 运算符。

正确的处理方式是:

$filePermission = fileperms('myFile.txt');
chmod('myFile.txt', $filePermission | 020);

请注意,我在数字前加上 0,这将使 PHP 将数字解释为八进制而不是十进制。

最近我制作了一个视频,试图帮助人们理解 chmod 以及八进制符号的工作原理,它可能会帮助您完成您想要完成的任务。 https://www.youtube.com/watch?v=j8FLsxdl0ns

如果您希望像命令行二进制文件那样拥有友好的菜单支持,您将需要自己实现解析器,或者从 PHP 调用命令行二进制文件,例如:

exec('/bin/chmod ' . escapeshellarg($perms) . ' ' . escapeshellarg($file));

但是请注意,这种用法比直接使用 PHP 中的内置 chmod 函数要慢得多。它还可能使您面临潜在的安全问题。