mkdir()创建0755而不是0775

时间:2016-04-20 14:39:09

标签: php file-permissions chmod mkdir

我有以下代码:

function makedirs($dirpath, $mode = 0775, $recursive = true) {
    return is_dir($dirpath) || mkdir($dirpath, $mode, $recursive);
}

$dir = 'path/to/folder/';

makedirs($dir, 0775);

问题是:即使在传递0775或其他任何内容作为$mode的参数时,mkdir()也会创建0755个permition文件夹。

例如,前面的代码将返回:

  • 路径/(0755)
  • 至/(0755)
  • 文件夹/(0755)

1 个答案:

答案 0 :(得分:3)

您可以执行以下操作

function makedirs($dirpath, $mode = 0775, $recursive = true) {
    $oldMask=umask(002);
    $status = is_dir($dirpath) || mkdir($dirpath, $mode, $recursive);
    umask($oldMask);
    return $status;
}

$dir = 'path/to/folder/'
makedirs($dir, 0775);

注意:虽然您可以使用umask(0)来允许甚至777权限但不建议这样做,因为它可能会造成安全问题。

修改

尝试为所有用户设置umask值系统,或者为自己从php中删除umask代码。 虽然上面的代码可行,但不建议在php脚本中设置umask。

根据PHP手册页

  

避免在多线程Web服务器中使用此功能。它更好   创建文件后,使用chmod()更改文件权限。   使用umask()可能会导致并发运行的意外行为   脚本和Web服务器本身,因为它们都使用相同的umask。

您可以在/ etc / bashrc或/ etc / profile文件中为所有用户设置umask。 默认情况下,大多数Linux发行版将其设置为0022(022)或0002(002)。打开/ etc / profile或〜/ .bashrc文件,输入:

# vi /etc/profile

OR

$ vi ~/.bashrc

追加/修改以下行以设置新的umask: umask 022

保存并关闭文件。更改将在下次登录后生效。所有UNIX用户都可以覆盖/ etc / profile文件中的系统umask默认值,〜/ .profile(Korn / Bourne shell)〜/ .cshrc文件(C shell),〜/ .bash_profile(Bash shell)或〜/ .login file(在登录时定义用户的环境)。

来源 http://www.cyberciti.biz/tips/understanding-linux-unix-umask-value-usage.html