应先用 is_dir() 检查目录是否存在,再调用 mkdir($path, 0755, true) 创建;避免重复创建警告,确保递归创建与权限正确,推荐封装为带日志的函数。

直接在调用 mkdir() 前用 is_dir() 判断目录是否存在,就能有效避免重复创建导致的警告或失败。
先检查再创建,不盲目执行
PHP 的 mkdir() 在目标目录已存在时会返回 false,并触发 Warning(如未屏蔽)。这不是错误,但会影响日志和调试。正确做法是:先确认目录不存在,再创建。
- 用
is_dir($path)检查——它只对真实目录返回 true,比file_exists()更精准(后者对文件也返回 true) - 若返回 false,再调用
mkdir($path, 0755, true) - 不推荐用
@mkdir()抑制警告,那只是隐藏问题,不能解决“重复创建”逻辑缺陷
递归创建要配好参数
多级路径(如 uploads/2026/11/02)容易因父目录缺失而失败。即使目录不存在,也要确保一次性建全:
- 第三个参数必须设为 true,启用递归创建:
mkdir($path, 0755, true) - 权限值
0755的前导0不能省略,否则会被当十进制解析(变成 755 十进制 → 权限错乱) - Windows 下权限参数无效,但保留无害;路径统一用正斜杠
/,兼容性更好
批量操作时逐个判断
要建多个目录(如按用户、年份、类型分组),别一股脑循环调用 mkdir():
立即学习“PHP免费学习笔记(深入)”;
- 把路径放进数组,用
foreach遍历 - 每轮都先
is_dir(),再决定是否mkdir(..., ..., true) - 避免某一个路径失败导致整个流程中断;可记录哪些新建成功、哪些已存在
封装成函数更稳妥
把判断 + 创建逻辑打包,复用性强,也方便加日志或异常反馈:
- 函数返回 bool:成功 true,失败 false(含已存在)
- 内部可选加
error_get_last()捕获最后一次系统错误,用于诊断 - 生产环境建议加简单日志,比如 “跳过已存在目录:xxx” 或 “新建目录:xxx”



















