PHP:向文件添加新权限

时间:2019-01-02 17:00:23

标签: php chmod

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

在我的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的替代品?

1 个答案:

答案 0 :(得分:3)

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

尽管您的示例“有效”,但如果文件已经具有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函数相比,此用法要慢得多。它还可能使您面临潜在的安全问题。