为啥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权限的目录?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能下载用 PHP 上传的文件?

Java - 无法创建具有 777 权限的目录(改为具有 775)[重复]

Linux主机安装网站系统时目录写入权限已经设置为777为啥还显示不可写呢?

在 PHP / Apache / Linux 上下文中,为啥 chmod 777 是危险的?

Linux之创建777权限的文件

linux系统的vps进ftp时文件属性不能修改为777,怎样给账户增加这个权限