72

我正在尝试使用 PHP 和以下命令在我的服务器上创建一个目录:

mkdir("test", 0777);

但它没有提供完整的权限,只有这些:

rwxr-xr-x
4

6 回答 6

173

模式由您的 current 修改umask022在这种情况下。

作品的方式umask是一种减法。您获取初始权限mkdir并减去umask获得实际权限:

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

如果您不希望发生这种情况,则需要将您的umask临时设置为零,这样它就不起作用了。您可以使用以下代码段执行此操作:

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

第一行将 更改umask为零,同时将前一个存储到$oldmask中。第二行使目录使用所需的权限和(现在无关)umask。第三行将 恢复umask到原来的样子。

有关更多详细信息,请参阅umaskmkdir的 PHP 文档。

于 2010-10-22T14:15:06.437 回答
14

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

$old = umask(0);
mkdir("test", 0777);
umask($old);
于 2010-10-22T14:15:55.017 回答
8

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

例子:

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

mkdir($dir);
chmod($dir, $permit);
于 2018-03-01T15:42:39.590 回答
3

对于那些尝试过的人

mkdir('path', 777);

它没有用。

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

参考

附言。这不是问题的解决方案,而只是已接受答案的附加组件

于 2017-12-07T15:31:48.753 回答
2

可能,您的umask设置为排除那些

于 2010-10-22T14:15:07.163 回答
0

就我而言,我必须对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找到

于 2019-12-08T14:25:59.893 回答