我有以下代码:
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文件夹。
例如,前面的代码将返回:
答案 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