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

我试图用 PHP 在我的服务器上创建一个目录,命令如下:

mkdir("test", 0777);

但是它没有给出完全的权限,只有这些:

rwxr-xr-x
88908 次浏览

该模式由当前的 umask修改,在本例中为 022

umask的工作方式是一种减法。你获得给予 mkdir的初始许可,然后减去 umask得到 真的许可:

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

如果你不想这种情况发生,你需要设置你的 umask暂时为零,所以它没有任何影响。您可以使用下面的代码片段来完成这项工作:

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

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

有关更多细节,请参见 乌玛斯克Mkdir的 PHP doco。

也许,你的 乌玛斯克设置为排除这些

文件和目录的创建受 umask 设置的影响。您可以通过如下操作 umask 来创建具有特定权限集的文件:-

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

为了那些尝试的人

mkdir('path', 777);

但是没有用。

显然,这是因为文件模式前面的0非常重要,它告诉 chmod 将传递的数字解释为八进制而不是十进制。

参考文献

这不是一个问题的解决方案,而只是一个附加的公认的答案

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

例如:

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


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

在我的例子中,我必须使用以下方法来处理 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