PHP中mkdir()创建目录需显式指定权限(如0755)并设recursive=true以递归创建多级目录;失败主因是父目录无写权限或未启用递归,实际权限受umask影响,应创建后用chmod()校准。

mkdir() 是 PHP 8.2 中用于创建目录的内置函数,用法简单但有几个关键细节直接影响是否成功,尤其在权限、嵌套和错误处理方面。
mkdir 创建单层目录(基础用法)
mkdir('/path/to/dir');-
必须确保父目录存在,否则会报错
Warning: mkdir(): No such file or directory。 - 默认权限是
0777(但受系统umask影响,实际可能为0755或更严格)。 - 返回布尔值:成功返回
true,失败返回false。
✅ 推荐写法(显式指定权限并检查结果):
$dir = '/tmp/myproject';
if (!mkdir($dir, 0755)) {
echo "创建失败:目录可能已存在,或父目录不可写";
}递归创建多级目录(常用场景)
PHP 8.2 支持 recursive 参数(第三个参数),设为 true 即可自动创建所有不存在的父级:
mkdir('/tmp/a/b/c', 0755, true);- 这会依次创建
/tmp/a→/tmp/a/b→/tmp/a/b/c。 - 若中间某层权限不足(如
/tmp被设为noexec或只读挂载),仍会失败。 - 不会覆盖已存在的目录,也不会报错(只要路径可达且有写权限)。
⚠️ 注意:Windows 下权限参数会被忽略,0755 无实际作用;Linux/macOS 下才生效。
立即学习“PHP免费学习笔记(深入)”;
安全与健壮性建议
-
避免硬编码绝对路径:优先用
__DIR__或dirname(__FILE__)拼接:$uploadDir = __DIR__ . '/uploads'; mkdir($uploadDir, 0755, true);
-
检查目录是否存在再创建(防止重复警告):
if (!is_dir($dir)) { mkdir($dir, 0755, true) or die("无法创建目录:$dir"); } -
配合
clearstatcache()避免缓存干扰(极少数情况,如快速连续判断):clearstatcache(true, $dir);
错误抑制不推荐:不要写
@mkdir(...),应主动捕获并处理失败原因。
不复杂但容易忽略。



















