在我的服务器上,我有一些具有不同权限的文件。
在我的php
脚本中,我想为每个文件向组添加写入权限。
使用linux cmd,chmod g+w file
可以完成这项工作。
但是如何使用php chmod()
来做到这一点?
这是我到目前为止尝试过的:
$filePermission = fileperms('myFile.txt');
# g+w = 020
chmod('myFile.txt', $filePermission+20);
这给了我想要的东西,但是Linuxchmod g+w
有没有php
的替代方案?
语法g+w
对PHP无效,大多数编程语言也无效,因为底层操作系统没有这些值的概念。chmod
系统调用仅接受八进制值,不接受字符串。在您的系统上,chmod
命令行可执行文件已实现解析器来实现此自定义功能。
虽然您的示例"有效",但如果文件已经具有 g+w,则会导致不良结果,因为再添加 20 个将打开额外的位并授予文件您不想要的额外权限。例如,如果文件权限020
并且您向其添加了020
,则该权限将变为040
。
Posix 文件权限是八进制位,其中每个数字代表读取、写入和执行的组合。因此,添加操作 (+
) 不正确,您需要使用按位运算(如AND
和OR
)来打开或关闭单个位。对于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
如果您希望像命令行二进制文件那样获得友好的 menomic 支持,则需要自己实现解析器,或者从 PHP 调用命令行二进制文件,例如:
exec('/bin/chmod ' . escapeshellarg($perms) . ' ' . escapeshellarg($file));
但请注意,这种用法比直接在 PHP 中使用内置的chmod
函数要慢得多。它还可能使您面临潜在的安全问题。