2016-06-16 3 views
-1

私のアプリケーションの中に少し問題があります。 私は多くのプロセスを自動的に起動し、crontabを使って、フォルダ内のファイルを読むためにPHPで書かれたサーバーから起動します。複数のプロセスが同じファイルを読み込んでいます

異なるプロセスが同じファイルを読み取り、アプリケーション内で問題を作成することがあります。 この問題を管理する方法はありますか? 実際には、フォルダ内のすべてのファイルを読み込み、それぞれを読み込んですぐに削除しますが、削除する前に別のプロセスが同じファイルを読み込むことがあります。

これはcakephp3(ファイルのようなので、いくつかのクラスは唯一cakephp3のためですが、質問のポイントではありません)読み込み、削除すると書かれた私のスクリプトです:(取得する

$xml_files = glob(TMP . 'xml/*.xml'); 
foreach($xml_files as $fileXml) 
{ 
    //read the file and put into a string or array or object 
    $explStr = explode('/', $fileXml); 
    $filename = $explStr[count($explStr) - 1]; 
    $path = TMP . '/xml/' . $filename; 
    $file = new File($path, false); 

    if($file->exists()){ 
     $string = $file->read(); 

     $file->close(); 
     $file->delete(); 
    } 
} 
+0

興味深いことに、[CakePHP File API](http://book.cakephp.org/3.0/ja/core-libraries/file-folder.html#file-api)は、ロックがフレームワークによって処理されることを示唆しています。 exists()条件はここでは役に立たないようですが、if($ string = $ file-> read())で置き換えようとしましたか? –

+0

私はそれを試みましたが、問題を解決する方法はありません@ code-kobold –

答えて

2

使用flock()またはファイルロックを取得しようと試みる)、それに従って動作する。

+0

どうすればあなたのスクリプトの中でそれをどう使用するのか教えてください。 –

+1

@AlessandroMinoccheri古典的なファイルハンドルではなく "File"クラスを使用しているので、私はできません。おそらく "File"クラスにロックメソッドが既に組み込まれているのかもしれません。 'flock()'ドキュメントにはいくつかの例があります。 – ShiraNai7

+0

@MarcinOrlowski私はflock()のドキュメントを見たことがありますが、もっと良い方法は何かを知りたいのです。 –

2

これは競合状態と呼ばれ、プロセスAがそれを使用するときにファイルをロックすることができます。ロックすると、ロックされているかどうかをチェックします。プロセスAが終了したらファイルのロックを解除します。

+0

私のスクリプトの中でそれを使用する方法の例をしてくださいできますか? –

関連する問題