直接用 mkdir($path, 0755, true) 即可递归创建多级目录,第三个参数 true 是关键,必须显式指定;需配合 is_dir() 判断存在性,避免重复创建失败,批量操作可遍历路径数组逐一执行。

直接用 mkdir($path, 0755, true) 就行——第三个参数设为 true 是关键,它启用递归创建,自动补全所有缺失的父级目录。
必须显式传入 true 作为第三个参数
默认情况下 mkdir() 的 $recursive 参数是 false,所以写 mkdir('a/b/c') 会报错:Warning: mkdir(): No such file or directory。只有明确加上 true,PHP 才会逐级检查并创建 a → a/b → a/b/c:
-
mkdir('uploads/images/2024/11', 0755, true)—— 一行搞定 - 权限
0755比0777更安全,避免被系统 umask 截断 - Windows 下路径用
/或\都可,但统一用/更兼容
创建前务必先判断目录是否存在
重复调用 mkdir(..., true) 在目标已存在时会返回 false(不报错但逻辑失败),容易掩盖问题。推荐组合 is_dir() 使用:
- 用
is_dir($path)判断,不要用file_exists()(它对文件也返回 true) - 示例:
if (!is_dir($path) && !mkdir($path, 0755, true)) { throw new RuntimeException("创建失败: $path"); } - 涉及敏感路径(如
vendor、storage)时,加白名单校验更稳妥
批量创建多个路径也很简单
把要建的路径放进数组,遍历调用即可。每条路径都走递归创建 + 存在性检查:
立即学习“PHP免费学习笔记(深入)”;
$paths = ['logs/error', 'cache/templates', 'uploads/users/1001'];- 循环中统一处理:
foreach ($paths as $p) { if (!is_dir($p)) mkdir($p, 0755, true); } - 注意路径中不能含
../等危险片段,建议用realpath()或白名单过滤
更稳妥的替代方案:Symfony Filesystem 组件
原生 mkdir() 没有原子性,在并发或 NFS 环境下可能出竞态;PHP 7.1+ 对中间目录权限检查更严格,易静默失败。推荐生产环境使用:
- 安装:
composer require symfony/filesystem - 使用:
$fs = new Symfony\Component\Filesystem\Filesystem(); $fs->mkdir($path, 0755); - 优势:自动重试、屏蔽重复创建异常、支持批量路径、符号链接等扩展能力



















