为啥PHP不能创建777权限的目录?
Posted
技术标签:
【中文标题】为啥PHP不能创建777权限的目录?【英文标题】:Why can't PHP create a directory with 777 permissions?为什么PHP不能创建777权限的目录? 【发布时间】:2011-04-29 04:46:17 【问题描述】:我正在尝试使用 php 和以下命令在我的服务器上创建一个目录:
mkdir("test", 0777);
但它没有提供完整的权限,只有这些:
rwxr-xr-x
【问题讨论】:
【参考方案1】:模式由您当前的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 和 mkdir 的 PHP 文档。
【讨论】:
【参考方案2】:文件和目录的创建受umask的设置影响。您可以通过如下操作 umask 创建具有特定权限集的文件:-
$old = umask(0);
mkdir("test", 0777);
umask($old);
【讨论】:
【参考方案3】:避免在多线程网络服务器中使用此功能。最好在创建文件后使用 chmod() 更改文件权限。
示例:
$dir = "test";
$permit = 0777;
mkdir($dir);
chmod($dir, $permit);
【讨论】:
【参考方案4】:对于那些尝试过的人
mkdir('path', 777);
它没有工作。
这是因为,显然,文件模式前面的 0 非常重要,它告诉 chmod 将传递的数字解释为八进制而不是十进制。
Reference
附言。这不是问题的解决方案,而只是已接受答案的附加组件
【讨论】:
需要明确的是,chmod
不做任何特殊的解释... PHP 将 0xxx 解析为八进制符号,该功能适用于任何地方,即使在常规函数中:echo max(050, 24); // echos 40, which is what 050 is
【参考方案5】:
您的umask 可能已设置为排除那些
【讨论】:
【参考方案6】:在我的情况下,我必须对centos7使用以下方式,从而解决了问题
$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
【讨论】:
以上是关于为啥PHP不能创建777权限的目录?的主要内容,如果未能解决你的问题,请参考以下文章
Java - 无法创建具有 777 权限的目录(改为具有 775)[重复]
Linux主机安装网站系统时目录写入权限已经设置为777为啥还显示不可写呢?