我试图用 PHP 在我的服务器上创建一个目录,命令如下:
mkdir("test", 0777);
但是它没有给出完全的权限,只有这些:
rwxr-xr-x
该模式由当前的 umask修改,在本例中为 022。
umask
022
umask的工作方式是一种减法。你获得给予 mkdir的初始许可,然后减去 umask得到 真的许可:
mkdir
0777 - 0022 ====== 0755 = rwxr-xr-x.
如果你不想这种情况发生,你需要设置你的 umask暂时为零,所以它没有任何影响。您可以使用下面的代码片段来完成这项工作:
$oldmask = umask(0); mkdir("test", 0777); umask($oldmask);
第一行将 umask更改为零,同时将前一行存储到 $oldmask中。第二行使用所需的权限和(现在不相关的) umask创建目录。第三行将 umask恢复到最初的状态。
$oldmask
有关更多细节,请参见 乌玛斯克和 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