You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP已做file_exists校验调用mkdir()仍提示文件存在告警如何解决

PHP mkdir 触发File exists告警的解决方案

告警根因

  • file_exists() 会对存在的普通文件、目录都返回true,若对应路径下已有和$carFecha同名的普通文件,会导致你写的目录存在判断逻辑失效。
  • PHP默认对file_exists()这类stat相关函数的返回值做了缓存,缓存未刷新时会导致判断结果和磁盘实际状态不一致。
  • 并发请求竞态:多请求同时执行这段逻辑时,可能出现请求A刚完成「目录不存在」的判断、还未执行创建,请求B已经完成了目录创建,此时请求A执行mkdir就会抛出已存在的告警。
  • 路径本身问题:如果$carFecha隐含不可见空白字符、或者大小写和已存在目录不一致(Windows/macOS等大小写不敏感系统下),也会触发该异常。

修复代码

$carFecha = "directory/to/a/date/";
// 先清理指定路径的stat缓存,确保判断结果为最新状态
clearstatcache(true, $carFecha);
// 用is_dir专门判断是否存在同名目录,排除同名普通文件的干扰
if (!is_dir($carFecha)) {
    echo $carFecha."</br>";
    // 第三个参数true开启多级目录递归创建,@抑制并发场景下的偶发告警
    @mkdir($carFecha, 0755, true);
}

修改说明

  • 用is_dir()替代file_exists():仅当路径存在且为目录时返回true,彻底排除同名普通文件的判断干扰。
  • 新增clearstatcache()调用:主动清理该路径的缓存,避免缓存导致的判断错误。
  • mkdir补充参数:第二个参数0755明确目录权限,第三个参数true开启多级目录递归创建,避免父目录不存在导致的其他错误。
  • 加@错误抑制符:并发场景下的竞态问题无法通过前置判断100%避免,加抑制符可以拦截偶发的存在告警,不会影响正常业务逻辑。

排查小技巧

如果修改后仍有告警,可以临时加一行调试代码确认路径状态:

var_dump(file_exists($carFecha), is_file($carFecha), is_dir($carFecha));

如果is_file($carFecha)返回true,说明存在和目标目录同名的普通文件,删除对应文件即可解决。

内容的提问来源于stack exchange,提问作者Excorpion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:06:05