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

これは競合状態です。あなたはそのようなことをするべきです:

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

参照:

于 2014-08-09T14:10:28.833 に答える