mkdir() 默认目录存在时返回 false 并触发 E_WARNING;应先用 is_dir() 检查再创建,避免警告;@ 抑制不推荐;递归创建需确保父目录可写;推荐封装健壮函数统一处理。

PHP 的 mkdir() 在目标目录已存在时,**默认返回 false,并触发 E_WARNING**。这不是错误,而是设计行为——它只负责“创建”,不负责“确保存在”。所以关键不是“怎么让它不报错”,而是“怎么正确判断并安全创建”。
先检查再创建,避免警告和 false 返回
每次调用 mkdir() 前,必须用 is_dir() 或 file_exists() 明确确认目录不存在:
-
is_dir($path)更精准,专用于判断是否为目录(排除同名文件干扰) - 不要只靠
!file_exists($path),因为可能有同名普通文件,导致 mkdir 失败且逻辑混乱 - 检查通过后再调用
mkdir($path, 0755, true),这样既避开警告,也确保逻辑可控
用 @ 抑制警告不推荐,但可临时应急
加 @ 符号能屏蔽 E_WARNING,例如:@mkdir($path, 0755, true)。但这是掩盖问题,不是解决问题:
- 如果因权限不足、路径非法或磁盘满导致失败,
@会把真正错误也吞掉 - 返回值仍是
false,你仍需判断,却失去了警告提示 - 线上环境应开启错误报告,不建议长期使用
@
递归创建时注意中间目录权限问题
即使设了 true,PHP 7.1+ 也会在某级父目录存在但不可写时直接返回 false:
- 比如
/a/b/c中/a/b已存在但权限是dr-xr-xr-x(无写入),mkdir('/a/b/c', 0755, true)就会失败 - 解决办法:用
is_writable(dirname($path))提前检查最靠近目标的父目录是否可写 - 必要时对已有父目录补权限:
chmod(dirname($path), 0755)(注意仅限可信环境)
更健壮的封装写法(推荐)
把判断、创建、错误处理打包成一个函数,复用且清晰:
- 输入路径,自动处理末尾斜杠(
rtrim($path, '/')) - 先
is_dir(),已存在就直接返回true - 否则尝试
mkdir(..., true),失败时用error_get_last()获取具体原因 - 成功后可选调用
chmod()确保权限符合预期(绕过 umask 影响)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











