5

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

$filepath = '/media/static/css/common.css';
if (!file_exists(dirname($filepath)))
{
   mkdir(dirname($filepath), 0777, TRUE);
}

“媒体”文件夹始终存在。必须创建“媒体”文件夹中的所有文件夹。在处理 common.css 文件之前,我想创建一个文件夹“/static/css”。

mkdir 偶尔会抛出异常“文件存在”。如果文件夹不存在,我尝试创建它。我认为“文件存在”是一个常见错误,因此该文件夹存在。

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

服务器:CentOS 6.4 版

谢谢你。

4

1 回答 1

11

This is a race condition situation. You should do something like that :

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

ref :

于 2014-08-09T14:10:28.833 回答