is_dir() 更合适,因为它专用于判断路径是否为有效目录,避免同名文件导致 mkdir 失败,语义更准确、安全性更高,且性能比 file_exists() 快 6 倍以上。

用 is_dir() 检查更好。
为什么 is_dir() 更合适
创建目录前,你要确认的不是“路径是否存在”,而是“这个路径是否已经是一个有效的目录”。
- is_dir($path) 专门检测该路径是否为目录,返回 true 仅当它存在且是目录;
- file_exists($path) 只判断路径是否存在(文件或目录都算),如果同名普通文件已存在,它也会返回 true,但后续 mkdir() 必然失败(因为不能在文件位置上再建目录)。
实际风险对比
- 用
!file_exists($path):若路径下有个叫logs的普通文件,检查会通过,mkdir 却报错“File exists”或直接失败 - 用
!is_dir($path):同名文件不会干扰判断,逻辑更安全、语义更准确
性能也更优
测试数据表明,在目录存在的情况下,is_dir() 比 file_exists() 快 6 倍以上(例如:0.46ms vs 2.93ms / 1000次)。虽然单次差异微小,但在高频调用(如日志写入、上传处理)中累积起来有明显优势。
推荐写法(含并发防护)
不要只靠一次 is_dir 判断,高并发下仍需二次确认:
$path = '/var/www/storage/2026/11';
if (!is_dir($path)) {
mkdir($path, 0755, true);
}
// 最终以 is_dir 结果为准,不依赖 mkdir 返回值
if (!is_dir($path)) {
throw new RuntimeException("目录 {$path} 创建失败或不可用");
}



















