2016-05-13 20 views
2

ファイルをアップロードするときにPHPで新しいディレクトリを作成すると問題が発生します。PHPディレクトリが存在するかどうかの確認問題

ディレクトリが作成されますが、同じスクリプトの別のインスタンスが同時に実行されている場合、ディレクトリの存在チェックが正しく機能しません(PHPの警告が表示されます)。

誰かが競合状態だと言ったが、ランダムなスリープ時間を追加した後でもこの問題が残っている。

usleep(mt_rand(1, 50)); 

if(!is_dir($dir)){ 
    mkdir($dir);  
} 

usleep(mt_rand(1, 50)); 

誰でも手助けできますか?

誰かが同時に複数のパートにファイルをアップロードすることを知っていますか?現在、アップロードされたパーツを一時ディレクトリに移動しています(is_dirは一時的なディレクトリで同じパーツが到着した場合に失敗します)。しかし、何度も失敗することがあります。時にはis_dirが警告を出すこともあります。

+0

"正しく動作しない"という意味を説明できますか? –

+0

ロック機構とファイルを使用して、チェックアウトされているかどうかを確認できます。 http://www.htmlite.com/php043.phpファイルがロックされている場合は、ディレクトリを作成しないでください。 – Neoaptt

+1

あなたは警告を書くことができますか? –

答えて

0

mkdir()は失敗した場合はtrueを返し、失敗した場合はfalseを返します。したがって、条件付き小切手の一部として使用することができます。

if (!is_dir($dir) && mkdir($dir)) { 
    // good to go 
} 
+0

私はそれが私のコードと同じだと思いますが、あなたはmkdirがifブロックにあるので、いつもmkdirが実行されるように見えるので、毎回警告を出さないでしょうか? –

+0

@ J.Doeそれは同じではありません。私の例の条件は、それが質問をしているので警告を生成しません(ディレクトリが作成されたのでしょうか?)。あなたの人は質問をしていないので、ディレクトリを作ることができないという警告が表示されます。 –

0

あなたは、現在のディレクトリ構造のシステムキャッシュが新鮮であるように、ディレクトリのページテストの最上部にclearstatcache()を使用します。 read more here

アップロードjavascriptはファイルを複数に分割し、4つのajaxリクエストをphpに送信するので、phpは4つのパートを同時に受け取ります。すべての部品が受け取られたら、PHPはそれらを結合してサーバ上のファイルを再現する必要があります

なぜそれを分割し、Ajaxを単一のリクエストとして送信し、PHPが各Blobファイルの部分を独自のスクリプト。これは問題を回避します。 PHP - with the correct setting up - 大きなファイルをチャンクブロックで快適に処理できます。

関連する問題