必须写成0777而非"0777"或777,因PHP权限参数需为八进制整数:前者正确解析为rwxrwxrwx;后者分别被当字符串转十进制777或直译十进制,均导致权限错乱。

直接写 0777,不加引号、不转成字符串、不写成十进制,开头必须带 0 表示八进制。
为什么必须写成 0777 而不是 "0777" 或 777
PHP 的 mkdir() 和 chmod() 函数的权限参数是整数类型,按八进制解释:
- 0777 → 正确:PHP 将其识别为八进制数,对应权限 rwxrwxrwx
-
"0777" → 错误:字符串会被强制转为整数 777(十进制),等价于八进制
1411,结果不可预测,通常权限异常 -
777 → 错误:十进制 777 对应八进制
1411,Linux 不识别该权限格式,实际生效的可能是截断后的低三位(即411→ r-x--x--x),完全不是预期效果
为什么 mkdir('dir', 0777) 实际常变成 0755
因为系统 umask 会“屏蔽”掉部分权限。Linux 默认 umask 是 022,创建目录时真实权限 = 指定权限 & (~umask),即:
0777 & (~022) = 0777 & 0755 = 0755
立即学习“PHP免费学习笔记(深入)”;
所以即使写了 0777,也达不到满权限——这不是 PHP 的 bug,而是 Unix 系统的安全机制。
想真正得到 0777 权限,该怎么做
分两步走,可靠且通用:
- 先用
mkdir($path, 0777, true)创建目录(true支持多级) - 再立即调用
chmod($path, 0777)强制设权(chmod()不受 umask 影响)
示例:
if (!is_dir($path)) {
if (mkdir($path, 0777, true)) {
chmod($path, 0777); // 关键:补这一句
}
}
生产环境建议用更安全的权限值
0777 在 Web 目录下风险高(尤其可写又可执行),常规推荐:
- 0755:适合绝大多数静态资源、日志目录(所有者全权,组/其他仅读+执行)
- 0700:适合敏感临时目录(仅所有者可读写执行)
- 避免在 Web 可访问路径下设 0777,除非明确需要外部进程(如 CLI 脚本或另一用户)协同写入



















