mkdir()创建0755而不是0775

问题描述 投票:3回答:1

我有以下代码:

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)
php file-permissions chmod mkdir
1个回答
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

要么

$ 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

© www.soinside.com 2019 - 2024. All rights reserved.