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

时间:2013-11-13 21:03:56

标签: 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 OCCASIONALLY抛出异常"文件存在"。我试图创建一个文件夹,如果它不存在。 '文件存在'我认为这是一个常见错误,因此文件夹存在。

我知道我给你的信息很少,这真是奇怪的错误。也许你可以给我任何建议,我必须做什么以及如何测试该bug并找到瓶颈。

服务器:CentOS版本6.4

谢谢。

1 个答案:

答案 0 :(得分:9)

这是一种竞争条件。你应该这样做:

$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);
        }
    }
}

参考: