ファイル ロックには、共有ロックと排他ロック、つまり読み取りロック (LOCK_SH) と書き込みロック (LOCK_EX) の 2 種類があります。
ファイル ロックは通常次のように使用されます:
$fp = fopen("filename", "a"); flock($fp, LOCK_SH) or die("lock error") $str = fread($fp, 1024); flock($fp, LOCK_UN); fclose($fp);
fwrite の後、ファイルはファイルが更新される前に fwrite を待ってから fclose するのではなく、fwrite の後、fclose 前にファイルを読み取ることでこれを確認できます
しかし、lock_ex をいつ使用し、lock_sh をいつ使用するのでしょうか?
読み取り時:
ダーティデータを表示したくない場合は、lock_sh 共有ロックを使用するのが最善です。次の 3 つの状況が考えられます:
1. 読み取り時に共有ロックが追加されていない場合、他のプログラムが書き込みを行う場合は (書き込みがロックされているかどうかに関係なく)、書き込みはすぐに成功します。ちょうど半分を読み取って、それが別のプログラムによって書き込まれた場合、読み取った後半は前半と一致しない可能性があります (前半は修正前、後半は修正後です)
2.読み取り 共有ロックが追加されます (読み取り専用なので、排他ロックを使用する必要はありません)。このとき、書き込みプログラムはロックを使用しないため、書き込みプログラムが直接書き込みを開始します。ファイルを変更すると、以前と同じ問題が発生します
3. 最も理想的な状況は、読み取り時にロック (lock_sh) し、書き込み時にロック (lock_ex) することです。このようにして、書き込みプログラムは読み取りプログラムを待機します。
書き込み時:
複数の書き込みプログラムがロックせずにファイルに対して同時に動作する場合、最終データの一部はプログラム a によって書き込まれ、一部はプログラム a によって書き込まれる可能性があります。プログラム b
の書き込み時にロックされている場合、この時点で読み取るプログラムが他にあるので、何を読み取るでしょうか?
1. リーダーが共有ロックを適用しない場合、ダーティ データを読み取ります。たとえば、プログラムを書くときは、a、b、c の 3 つの部分を書く必要があります。a を書いた後、この時点で読み込まれるのは a です。次に、b を書き続けると、読み込まれるのは ab になります。 write c. この時点で読み取るのは abc です。
2. リーダーが以前に共有ロックを申請していた場合、リーダーは書き込みが終了するのを待ってから読み取ります。