【问题标题】:mkdir function throw exception 'File exists' even after checking that directory doesn't exist即使在检查该目录不存在之后,mkdir 函数也会抛出异常“文件存在”
【发布时间】:2013-11-26 16:11:12
【问题描述】:

我偶然发现了 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 版

谢谢。

【问题讨论】:

  • 你可能想试试 PHP 的 is_dir() 而不是 file_exists()。它检查目录而不是文件。
  • @showdev 不幸的是同样的问题存在。
  • 您在根目录而不是工作文件夹中创建目录
  • var_dump(is_dir('/media/static/css/')) 的输出是什么?
  • 如果您有多个客户端同时调用 php 文件,则脚本的多个实例可能都从 file_exists 中获取 false,然后并行尝试调用 mkdir(除了第一个脚本之外的所有种族将获得例外)

标签: php mkdir


【解决方案1】:

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

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

参考:

【讨论】:

  • 如果您要抑制 mkdir 错误,使用 is_dir 有什么好处吗?从始终执行 mkdir 中节省 CPU 周期或其他东西?
  • 你在说哪个 is_dir ?第一个还是第二个?
  • 首先是is_dir检查
  • 我想你可以同时做。我不知道性能。当我写它时,它看起来更干净。
  • 你应该顺便使用文件系统抽象 :) github.com/thephpleague/flysystem/blob/master/src/Adapter/…
猜你喜欢
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多