启用递归创建目录需显式传第三个参数true,如mkdir('logs/2026/11/03', 0755, true),并配合is_dir()判断避免重复创建,注意权限参数必须为八进制0755且Windows下忽略权限但受限于路径长度。

直接加第三个参数 true,启用递归创建即可。这是最简单也最常用的解法。
必须显式传 true 启用递归
PHP 的 mkdir() 默认不建父目录,哪怕路径是 logs/2026/11/03,只要 logs 不存在,就会报 No such file or directory。
解决方法就是把第三个参数设为 true:
-
mkdir('logs/2026/11/03', 0755, true)—— 自动逐级创建 logs → 2026 → 11 → 03 - 别漏掉权限参数:第二个参数不能省,推荐写
0755(开头的0表示八进制) - 写成
755是十进制,实际权限会变成完全不可预期的值
创建前先检查是否已存在
避免重复调用或覆盖已有目录,建议加一层判断:
- 用
is_dir($path)判断目标是否已是目录 - 如果已存在,直接跳过;不存在再调
mkdir(..., true) - 不要只依赖
file_exists(),它对目录和文件都返回 true,不够精准
失败时要捕获并排查原因
即使开了 recursive=true,仍可能失败。常见原因有:
立即学习“PHP免费学习笔记(深入)”;
- 父目录存在但权限不足(比如只读)—— PHP 7.1+ 会直接中断,不再继续
- 当前 PHP 进程用户(如
www-data)对上级路径无写权限或执行(x)权限 - 受
open_basedir限制,路径超出允许范围 - SELinux、容器环境或磁盘配额导致静默拒绝
建议写个基础封装函数,带错误提示:
if (!mkdir($path, 0755, true) && !is_dir($path)) {trigger_error("无法创建目录: $path", E_USER_WARNING);
}
Windows 和跨平台注意事项
路径分隔符不用特别处理:/ 在 Windows 下 PHP 也能识别,比 \ 更安全;
权限参数 0755 在 Windows 下会被忽略,所以无需担心;
但要注意 Windows 路径长度限制(默认 260 字符),长路径可能触发失败。



















