2012-04-24 25 views
2

私は、この問題についてこのサイトに類似の質問があることを知っていますが、この質問や回答は私が必要とするものではありません。同じ時間に同じファイルに書き込む

私はフラットファイルベースのCMSを構築しています。 何例えば、場合:

  1. 2、3、10 .....モードrequestesを追加でfwriteのは、同じ時間に同じPHPファイル "contact_form_messages_container.php" になっていませんか?

  2. 2、3、10 ..... "w"モードでのfwriteは、特定のページ訪問の簡単なnubmerを同じ時間に保持する同じphpファイルに来ますか?

私は群れ()関数について知っているが、それは二つ以上の群れ()要求が起こる可能性は、同じ時間に来る...誰もがこの問題の解決策を知っていますか?私が気にしているのは、ターゲットファイルが利用可能になるまで、ある程度の時間、looopを使ってスクリプトを使用することですが、これがどこでどのように動作するのかは分かりません。 誰かがこの問題に関して実用的な経験を持っていますか? ありがとうございます!

+0

実際の回答ではありませんが、データベースを使用してください。本当に。 :P –

答えて

0

flock()関数は、ファイル操作のための複数の並行リーダとライタを処理するように設計されています。デフォルトでflock()は、互換性のあるロックを取得できる(共有または排他)までプロセスを中断することがあります。取得したロックは、後で他のプロセスがファイルに対して操作できるように解放することができます。ロックは、ファイルがクローズされるかプロセスが終了するときに暗黙的に解放されます。

ファイルがNFS上に存在しない限り、2つの競合するロックが同時に発生する状況に遭遇することは非常に疑問です。


以下は基本的なflock()を用いた例を示しています。中断中からプロセスを防止するLOCK_EX又はLOCK_SHと共にLOCK_NBフラグを使用

// open the file (take care to not use "w" mode) 
$f = fopen('file.txt', 'r+'); 
// obtain an exlusive lock (may suspend the process) 
if (flock($f, LOCK_EX)) { 
    // this process now holds the only exclusive lock 

    // make changes to the file 

    // release the lock 
    flock($f, LOCK_UN); 
} 
// don't perform any write operation on $f here 
fclose($f); 

と、呼び出しがfalseを返す場合、プロセスが中断されたかどうかを判断するために3番目のパラメーターを渡すことができます(Windowsではサポートされていません)。

if (false === flock($f, LOCK_EX | LOCK_NB, $wouldblock)) { 
    if ($wouldblock) { 
     // the lock could not be obtained without suspending the process 
    } else { 
     // the lock could not be obtained due to an error 
    } 
} 
0

ファイルをロックしている間に書き込み操作を行い、スリープ状態のwhileループに入れます。アプリケーションがファイルシステムコールを時系列的に作成することに依存しない限り、それは動作するはずです。

これは、アプリケーションが順番に実行される書き込み操作に依存する場合は、競合状態のために開かれます。

関連する問題