我正在尝试使用PHP创建一个目录,命令如下:
mkdir("test", 0777);
但它不会给出完整的权限,只会有以下这些:
rwxr-xr-x
在这种情况下,模式受当前umask
的影响,其值为022
。
umask
的工作方式是一种减法。您需要从mkdir
给出的初始权限中减去umask
来获取实际权限:
0777
- 0022
======
0755 = rwxr-xr-x.
如果您不希望发生这种情况,您需要暂时将umask
设置为零,以便它不起作用。 您可以使用以下代码片段来执行此操作:
$oldmask = umask(0);
mkdir("test", 0777);
umask($oldmask);
第一行将umask
更改为零,并将先前的值存储在$oldmask
中。第二行使用所需的权限创建目录,同时忽略了(现在不相关的)umask
。第三行将umask
恢复到最初的值。
umask的设置会影响文件和目录的创建。您可以通过以下方式操纵umask来创建具有特定权限集的文件:
$old = umask(0);
mkdir("test", 0777);
umask($old);
在多线程网络服务器中避免使用此函数。最好在创建文件后使用chmod()更改文件权限。
示例:
$dir = "test";
$permit = 0777;
mkdir($dir);
chmod($dir, $permit);
mkdir('path', 777);
却失败的人来说,这是因为在文件模式之前添加的0非常重要,它告诉chmod将传递的数字解释为八进制而不是十进制数。参考此处。$oldmask = umask(000);//it will set the new umask and returns the old one
mkdir("test", 0777);
umask($oldmask);//reset the old umask
chmod
不会进行任何特殊的解释... PHP 将 0xxx 解析为八进制表示法,这个特性在任何地方都有效,甚至在常规函数中也能使用:echo max(050, 24); // 输出 40,即 050 所代表的值
。 - Christian