PHP中mkdir设置权限异常求助(CentOS7.9+PHP5.4.16)
问题分析与解决方案
核心原因:Umask权限掩码差异
- Umask是系统用来限制新创建文件/目录默认权限的掩码,实际创建权限的计算逻辑是:指定权限 & (~umask)
- 普通用户john的umask值为
0002,代入计算:0775 & (~0002) = 0775,所以创建的目录权限是drwxrwxr-x - apache用户的默认umask值是
0022,代入计算:0775 & (~0022) = 0755,因此创建的目录权限变成drwxr-xr-x
为什么chmod能正常生效?
chmod()是直接强制设置文件/目录的权限,完全不受umask的限制,所以不管apache的umask是什么,执行chmod('./depth1',0775)都会直接把权限改成775。
解决办法
如果需要apache用户创建目录时直接得到775权限,有两种可行方式:
- 临时修改PHP进程的umask:在调用
mkdir()前先执行umask(0002);,这样创建时的实际权限就会符合预期umask(0002); mkdir('/tmp/mydir', 0775); - 修改apache用户的默认umask:
- 编辑apache的环境配置文件(比如
/etc/sysconfig/httpd,或者新建/etc/httpd/conf.d/umask.conf),添加一行UMASK 0002 - 重启apache服务:
systemctl restart httpd - 注意:修改默认umask会影响apache所有新创建的文件和目录,要结合实际业务需求确认是否合适
- 编辑apache的环境配置文件(比如
内容的提问来源于stack exchange,提问作者Laurent Mortier
相关产品推荐
相关产品推荐

