3

わかりました。このサイトでこの問題について同様の質問があったことは知っていますが、この質問と提供された回答はどれも私が必要としているものではありません。

フラットファイルベースのCMSを構築しています。たとえば、次の場合はどうなりますか。

  1. 2、3、10 .....追加モードのfwriteリクエストは、同じphpファイル「contact_form_messages_container.php」に同時に送信されますか?

  2. 2、3、10 ..... fwrite in "w"モードのリクエストは、特定のページへのアクセスの単純な数を保持する同じphpファイルに届きます。

flock()関数については知っていますが、2つ以上のflock()リクエストが同時に発生する可能性があります...この問題の解決策を知っている人はいますか?私が頭に浮かぶのは、usleep()-ターゲットファイルが使用可能になるまで、しばらくの間ループ中にスクリプトを使用することですが、それが機能するかどうか、どこで、どのように実行するかわかりません。誰かがこの問題について実際的な経験を持っていますか?前もって感謝します!

4

2 に答える 2

1

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

ファイルがNFS上にない限り、2つの競合するロックが同時に与えられる状況に遭遇することはないでしょう。


以下は、以下を使用する基本的な例を示していflock()ます。

// 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);

LOCK_NBフラグを一緒に使用するLOCK_EXLOCK_SH、プロセスが中断されるのを防ぎます。呼び出しが返さ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
    }
}
于 2012-04-24T08:49:57.190 に答える
0

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

ただし、アプリケーションが書き込み操作に依存している場合、これは競合状態に対して開かれます。

于 2012-04-24T06:57:50.773 に答える