最有效方式是显式传入第三个参数true启用递归模式,如mkdir('uploads/images/2024/11', 0755, true);权限值必须以0开头(如0755),创建前应先用is_dir()判断是否存在,并注意umask对实际权限的影响。

直接让 mkdir() 递归创建,是避免父目录不存在导致失败的最有效方式——关键就是显式传入第三个参数 true。
必须启用递归模式($recursive = true)
PHP 的 mkdir() 默认不创建上级目录。比如路径 'uploads/images/2024/11',只要 uploads 或中间任一级缺失,就会报 Warning: mkdir(): No such file or directory 并返回 false。
- 错误写法:
mkdir('uploads/images/2024/11', 0755)—— 第三个参数缺省为false,必然失败 - 正确写法:
mkdir('uploads/images/2024/11', 0755, true)—— 自动逐级创建所有缺失父目录
权限设置要写对:0755 是八进制,不是 755
权限值必须以 0 开头,否则 PHP 会按十进制解析,结果完全错误(例如 755 实际等价于八进制 1363,远超权限范围)。
- ✅ 正确:
0755、0775、0644 - ❌ 错误:
755、"0755"(字符串)、intval("0755")
创建前先判断是否存在,避免无谓调用
即使启用了递归,重复调用 mkdir($path, 0755, true) 也不会报错,但会浪费系统资源,且可能掩盖逻辑问题。
- 推荐先用
is_dir($path)检查 - 再结合
is_writable(dirname($path))验证父目录可写性,提前发现权限隐患 - 示例:
php
if (!is_dir($path) && !mkdir($path, 0755, true)) {
throw new Exception("无法创建目录:{$path}");
}
注意 umask 和运行环境限制
即使 mkdir() 返回 true,实际权限也可能被系统 umask 截断(如默认 0022 会让 0755 变成 0733),导致后续写入失败。
- 临时屏蔽 umask:在
mkdir()前调用umask(0),之后再恢复原值 - 创建后补权更稳妥:
chmod($path, 0755)确保最终权限符合预期 - 容器或 SELinux 环境下,还需确认上下文策略是否允许目录创建
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











