mkdir()调用的混淆权限

时间:2014-01-27 19:30:11

标签: php permissions mkdir

问题本身很简单,但它真的让我发疯了......我在Stack上读过很多其他问题,但无论我如何改变代码,问题都在不断发生......

为什么......

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-data)具有相同的umask,并拥有具有写权限的父目录。
  • 我可以在终端上以www-data身份登录,并成功执行chmod 6750,获得正确的结果。

为什么PHP似乎忘了如何计算?有些问题提到了另外一个Apache2参数搞乱,但我无法弄清楚哪一个......

1 个答案:

答案 0 :(得分:0)

没有chmod($dir, 6750)会不会更简单?

$old = umask(0); 
mkdir($path, 06750); 
umask($old);

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