为什么PHP不能创建具有777权限的目录?

76

我正在尝试使用PHP创建一个目录,命令如下:

mkdir("test", 0777);

但它不会给出完整的权限,只会有以下这些:

rwxr-xr-x
6个回答

181

在这种情况下,模式受当前umask的影响,其值为022

umask的工作方式是一种减法。您需要从mkdir给出的初始权限中减去umask来获取实际权限:

  0777
- 0022
======
  0755 = rwxr-xr-x.

如果您不希望发生这种情况,您需要暂时将umask设置为零,以便它不起作用。 您可以使用以下代码片段来执行此操作:

$oldmask = umask(0);
mkdir("test", 0777);
umask($oldmask);

第一行将umask更改为零,并将先前的值存储在$oldmask中。第二行使用所需的权限创建目录,同时忽略了(现在不相关的)umask。第三行将umask恢复到最初的值。

有关更多详细信息,请参见PHP文档中的umaskmkdir


14

umask的设置会影响文件和目录的创建。您可以通过以下方式操纵umask来创建具有特定权限集的文件:

$old = umask(0);
mkdir("test", 0777);
umask($old);

10

在多线程网络服务器中避免使用此函数。最好在创建文件后使用chmod()更改文件权限。

示例:

$dir = "test";
$permit = 0777;

mkdir($dir);
chmod($dir, $permit);

4
对于那些尝试使用mkdir('path', 777);却失败的人来说,这是因为在文件模式之前添加的0非常重要,它告诉chmod将传递的数字解释为八进制而不是十进制数。参考此处
注:这不是问题的解决方案,仅是已接受答案的补充。

要明确的是,chmod 不会进行任何特殊的解释... PHP 将 0xxx 解析为八进制表示法,这个特性在任何地方都有效,甚至在常规函数中也能使用:echo max(050, 24); // 输出 40,即 050 所代表的值 - Christian

2
可能你的 umask 被设置为排除那些文件。

0
在我的情况下,我必须使用以下方式来解决CentOS 7的问题。
$oldmask = umask(000);//it will set the new umask and returns the old one 
mkdir("test", 0777);
umask($oldmask);//reset the old umask

更多细节可以在https://www.php.net/manual/en/function.umask.php找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接