使用mkdir的权限不起作用

时间:2011-06-03 15:43:42

标签: php linux

我无法理解为什么必须使用chmod来获取正确的权限。 该文件已成功创建,但我在mkdir中指定了0755而不是0775。

http://php.net/manual/en/function.mkdir.php

我必须在chmod之后mkdir设置正确的权限。

安全模式在php.ini中关闭,该文件夹属于php的组和所有者(www-data)

这不起作用:

  if(!is_dir("/var/www/customers/$username/$project_name")) 
  {
    mkdir("/var/www/customers/$username/$project_name",0775);

  }

但这样做:

  if(!is_dir("/var/www/customers/$username/$project_name")) 
  {
    mkdir("/var/www/customers/$username/$project_name");
    chmod("/var/www/customers/$username/$project_name",0775);

  }

3 个答案:

答案 0 :(得分:39)

是的,这是因为umask ......

来自文档的评论:http://php.net/manual/en/function.mkdir.php

  

您可能会注意到在创建时   使用此代码的新目录:

     

mkdir($ dir,0777);

     

创建的文件夹实际上有   0755的权限,而不是   规定   你为什么这么问?因为umask():http://php.net/manual/en/function.umask.php

     

至少是umask的默认值   在我的设置,是18.这是22八进制,   要么   0022.这意味着当您使用mkdir()将CHMOD创建的文件夹添加到   0777,PHP需要0777和substracts   umask的当前值,在我们的   案例0022,结果是0755 -   这不是你想要的,   可能。

     

对此的“修复”很简单,包括   这一行:

     

$ old_umask = umask(0);

     

在创建文件夹之前   mkdir()拥有你的实际价值   把它用作CHMOD。如果你能   喜欢将umask恢复到原来的状态   完成后的价值,请使用:

     

的umask($ old_umask);

答案 1 :(得分:1)

我认为您可能需要修改您的umask。

正如mkdir联机帮助页上所述:

  

该模式也由当前的umask修改,您可以使用umask()更改。

现在,查看umask()联机帮助页,其中一条评论确认了我内心的想法:

  

“最好在创建文件后使用chmod()更改文件权限。”

换句话说,我相信你这样做的方式更安全:

  

设置您的umask,以便为您的用户创建私有文件,然后使用chmod打开它们。

答案 2 :(得分:0)

在创建目录之前尝试调用此函数:clearstatcache();另外,如果你选择了另一个用户,也许你应该检查一下你是否可以使用mkdir。