mkdir()递归建目录权限设置需用八进制(如0755)、显式启用$recursive=true、注意umask截断及Windows忽略权限;建议先is_dir()判断再创建并过滤路径。

PHP 中用 mkdir() 递归创建多级目录时,权限设置关键在三点:八进制写法、umask 影响、以及 Windows 下的忽略特性。直接写 0755 是最常用也最稳妥的做法,但不能只传数字就完事。
权限参数必须用八进制写法
权限值要以 0 开头,比如 0755 或 0777。如果写成 755(没前导零),PHP 会当成十进制数解析,实际权限变成完全不同的值(755 十进制 ≈ 1363 八进制 → 权限混乱)。所以务必写:
-
mkdir('a/b/c', 0755, true)✅ -
mkdir('a/b/c', 755, true)❌(错误)
递归创建必须显式启用 third 参数
第三个参数 $recursive 必须设为 true,否则即使父目录不存在,mkdir() 也会失败。例如:
-
mkdir('uploads/2026/11/02', 0755, true)—— 会自动建好 uploads、2026、11 三级父目录 -
mkdir('uploads/2026/11/02', 0755)—— 若 uploads 不存在,直接报错
权限实际生效受 umask 限制
即使写了 0777,系统也可能按当前 umask 截断。比如 umask 是 0022,那 0777 & ~0022 = 0755。如需确保权限严格生效,可临时调整:
立即学习“PHP免费学习笔记(深入)”;
- 创建前用
umask(0)清除掩码(注意之后要恢复) - 或创建后补一句
chmod($path, 0755)强制修正 - Windows 系统下权限参数被完全忽略,不用纠结
安全建议:先判断再创建
避免重复创建触发警告,也防止覆盖已有目录:
- 用
is_dir($path)判断,别用file_exists()(它对文件也返回 true) - 创建失败时捕获错误,比如用
error_get_last()查具体原因 - 路径含变量时,确保已过滤(如防
../路径遍历)



















