Php mkdir()调用的权限混乱

Php mkdir()调用的权限混乱,php,permissions,mkdir,Php,Permissions,Mkdir,这个问题本身很简单,但它真的让我发疯了。。。我已经阅读了堆栈上的许多其他问题,但无论我如何更改代码,问题总是不断发生 为什么 if(!is_dir($dir)){ clearstatcache(); $mask = umask(0); if(mkdir($dir, 6750)) chmod($dir, 6750); umask($mask); } 。。。生产 d--s-wxrwT 2 owner group 4096 Jan 27 20:22 dir/ 。。。

这个问题本身很简单,但它真的让我发疯了。。。我已经阅读了堆栈上的许多其他问题,但无论我如何更改代码,问题总是不断发生

为什么

if(!is_dir($dir)){
    clearstatcache();
    $mask = umask(0);
    if(mkdir($dir, 6750)) chmod($dir, 6750);
    umask($mask);
}
。。。生产

d--s-wxrwT 2 owner group 4096 Jan 27 20:22 dir/
。。。当
$dir
是新创建的
dir/
的绝对路径时

正如你所看到的,即使我请求了6750个权限集,我还是得到了一个可爱的、但毫无用处的5136。。。(然而,用户和组是正确的)以下是我所做的:

  • 正在清除统计缓存
  • 在创建之前将PHP umask设置为0,然后立即恢复
  • Chmod新创建的文件夹成功,只是为了确保
我知道的是:

  • 系统的umask值为0037,这不是6750和5136之间的差异
  • 创建文件夹(www数据)的用户具有相同的umask,并拥有具有写入权限的父目录
  • 我可以在终端上登录为www数据,并成功执行
    chmod 6750
    ,获得正确的结果

为什么PHP似乎忘记了如何计算?一些问题提到了一个额外的Apache2参数,但我不知道哪一个…

如果没有
chmod($dir,6750)
,它会更简单吗

还有一件事,你的模式值应该从0开始。
阅读有关模式可能值的信息。

chmod
是一件愚蠢的事情。我不反对,我只是有点绝望。。。加一个零修正它,谢谢。我还删除了所有无用的行。我只是认为零是UNIX权限的常见部分(粘性位、GUID、UUID等等)。我想这只是另一个PHP惊喜…我很高兴我帮助了你。
$old = umask(0); 
mkdir($path, 06750); 
umask($old);