在我的服务器上,我有一些文件具有不同的权限。
在我的php
脚本中,我想为每个文件添加写入权限到组。
使用linux cmd,chmod g+w file
完成该工作。
但是如何使用php chmod()
来做到这一点?
这是我到目前为止尝试过的:
$filePermission = fileperms('myFile.txt');
# g+w = 020
chmod('myFile.txt', $filePermission+20);
这给了我我想要的东西,但是Linux php
是否有chmod g+w
的替代品?
答案 0 :(得分:3)
语法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
如果您希望像命令行二进制文件一样具有友好的经济学支持,则需要自己实现解析器,或者从PHP调用命令行二进制文件,例如:
exec('/bin/chmod ' . escapeshellarg($perms) . ' ' . escapeshellarg($file));
但是请注意,与直接在PHP中使用内置的chmod
函数相比,此用法要慢得多。它还可能使您面临潜在的安全问题。