【发布时间】:2011-04-29 04:46:17
【问题描述】:
我正在尝试使用 PHP 和以下命令在我的服务器上创建一个目录:
mkdir("test", 0777);
但它没有提供完整的权限,只有这些:
rwxr-xr-x
【问题讨论】:
我正在尝试使用 PHP 和以下命令在我的服务器上创建一个目录:
mkdir("test", 0777);
但它没有提供完整的权限,只有这些:
rwxr-xr-x
【问题讨论】:
模式由您当前的umask 修改,在本例中为022。
umask 的工作方式是减法。您将最初授予mkdir 的权限减去umask 以获得实际 权限:
0777
- 0022
======
0755 = rwxr-xr-x.
如果您不希望这种情况发生,您需要将您的umask 临时设置为零,这样它就不起作用了。您可以使用以下 sn-p 执行此操作:
$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 将传递的数字解释为八进制而不是十进制。
附言。这不是问题的解决方案,而只是已接受答案的附加组件
【讨论】:
chmod 不做任何特殊的解释... PHP 将 0xxx 解析为八进制符号,该功能适用于任何地方,即使在常规函数中:echo max(050, 24); // echos 40, which is what 050 is
您的umask 可能已设置为排除那些
【讨论】:
在我的情况下,我必须对centos7使用以下方式,从而解决了问题
$oldmask = umask(000);//it will set the new umask and returns the old one
mkdir("test", 0777);
umask($oldmask);//reset the old umask
【讨论】: