Php mkdir函数抛出异常';文件存在';即使在检查了该目录之后';不存在

Php mkdir函数抛出异常';文件存在';即使在检查了该目录之后';不存在,php,mkdir,Php,Mkdir,我偶然发现了PHP中mkdir函数的各种奇怪行为。下面是我的简单代码示例 $filepath = '/media/static/css/common.css'; if (!file_exists(dirname($filepath))) { mkdir(dirname($filepath), 0777, TRUE); } “媒体”文件夹始终存在。必须创建“媒体”文件夹中的所有文件夹。在处理common.css文件之前,我想创建一个文件夹“/static/css” mkdir偶尔抛出异常“

我偶然发现了PHP中mkdir函数的各种奇怪行为。下面是我的简单代码示例

$filepath = '/media/static/css/common.css';
if (!file_exists(dirname($filepath)))
{
   mkdir(dirname($filepath), 0777, TRUE);
}
“媒体”文件夹始终存在。必须创建“媒体”文件夹中的所有文件夹。在处理common.css文件之前,我想创建一个文件夹“/static/css”

mkdir偶尔抛出异常“文件存在”。我试图创建一个不存在的文件夹。”“文件存在”是一个常见错误,我认为,因此文件夹存在

我知道我给你的信息很少,这是一个非常奇怪的错误。也许你可以给我一些建议,告诉我该怎么做,如何测试这个bug并找到瓶颈

服务器:CentOS 6.4版


谢谢。

这是一个比赛情况。你应该这样做:

$filepath = '/media/static/css/common.css';
// is_dir is more appropriate than file_exists here
if (!is_dir(dirname($filepath))) {
    if (true !== @mkdir(dirname($filepath), 0777, TRUE)) {
        if (is_dir(dirname($filepath))) {
            // The directory was created by a concurrent process, so do nothing, keep calm and carry on
        } else {
            // There is another problem, we manage it (you could manage it with exceptions as well)
            $error = error_get_last();
            trigger_error($error['message'], E_USER_WARNING);
        }
    }
}
参考:


您可能希望尝试PHP而不是
文件\u exists()
。它检查目录而不是文件。@showdev不幸的是,同样的问题也存在。您正在根目录而不是工作文件夹中创建目录
var\u dump(is\u dir('/media/static/css/'))
?如果有多个客户端同时调用php文件,脚本的多个实例可能都从文件_exists中得到false,然后并行尝试调用mkdir(除第一个赢得比赛的脚本外,其他所有脚本都会得到异常)。如果仍然要抑制mkdir错误,那么使用Is_dir有什么好处吗?从总是执行mkdir中节省CPU周期或其他什么?你说的是什么?第一个还是第二个?第一个很重要,我想你们两个都可以。我对表演一无所知。当我写它的时候,它看起来更干净了。顺便说一下,你应该使用文件系统抽象:)