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);