mkdir()失败时返回false,需显式检查返回值并结合error_get_last()获取错误详情,同时预先验证父目录可写性、路径合法性及环境限制。

PHP 中 mkdir() 创建失败时,不能只靠报错提示,得主动捕获并处理——因为默认只是触发 E_WARNING,程序不会中断,但你也得不到明确结果。
用返回值判断是否成功
这是最直接、最可靠的方式。mkdir() 成功返回 true,失败返回 false。必须显式检查:
- 别写成
mkdir($path, 0755, true);就完事,不接返回值就等于没检查 - 正确写法:
if (!mkdir($path, 0755, true)) { /* 处理失败 */ } - 尤其在多级路径中,哪怕只有一级父目录权限不对或被只读锁定,也会返回
false(PHP 7.1+ 行为更严格)
获取具体错误信息
返回 false 后,调用 error_get_last() 可拿到最后一次错误的完整描述:
-
$err = error_get_last(); echo $err['message'];会输出类似mkdir(): Permission denied或No such file or directory - 注意:该函数只返回最近一次错误,需在
mkdir()调用后立即使用 - 配合
trigger_error()可主动抛出带上下文的警告,便于日志追踪
提前验证关键条件,减少被动报错
与其等 mkdir() 失败再处理,不如事先排查常见堵点:
立即学习“PHP免费学习笔记(深入)”;
- 用
is_writable(dirname($path))检查父目录是否可写(不是目标路径本身,是它的上一级) - 确认路径中没有符号链接指向挂载分区(如
/nas),否则可能受挂载选项(如umask)限制 - Linux 下检查 SELinux 或容器环境是否拦截;Windows 下留意路径总长是否超 260 字符
- 避免
open_basedir限制导致即使递归参数为true也直接拒绝
加一层封装让逻辑更稳
把判断、创建、错误收集打包成函数,复用性高且不易漏:
- 先
is_dir()确认是否已存在,避免重复创建引发竞争 - 调用
mkdir(..., true)并检查返回值 - 失败时汇总路径、权限、父目录可写状态等信息,方便调试
- 生产环境建议搭配白名单校验路径(如限定只能在
uploads/或storage/下操作)



















