10

私は PHP で群れのメカニズムを勉強していますが、LOCK_SH モードの機能を理解するのに苦労しています。他のスクリプトが書き込みできないようにファイルをロックしているサイトを読みましたが、読み取りは可能です。ただし、次のコードは期待どおりに機能していないようです:

$fp = fopen('my_file.txt','r');

flock($fp, LOCK_SH);
sleep(20);
flock($fp, LOCK_UN);

そしてfile2.phpに私は持っています

$fp = fopen('my_file.txt','a');
fwrite($fp,'test');

ファイルを 20 秒間ロックする最初のスクリプトを実行します。ロックが設定された状態で file2.php を実行すると、すぐに実行が終了します。その後、「my_file.txt」を開くと、文字列「test」が追加されました (「file1.php」はまだ実行されていました)。「file2.php」を変更して、ロックされたファイルから読み取り、問題なく赤くなるようにします。どうやら...「LOCK_SH」の縫い目はまったく何もしません。ただし、LOCK_EX yes を使用すると、ファイルがロックされ、スクリプトはファイルから読み書きできなくなります。Easy PHP を使用しており、Windows 7 で実行しています。

4

3 に答える 3

19

LOCK_SH は SHARED LOCK を意味します。任意の数のプロセスが同時に SHARED LOCK を持つことができます。これは、一般にリーダー ロックと呼ばれます。

LOCK_EX は排他的ロックを意味します。一度に 1 つのプロセスだけが、特定のファイルへの排他ロックを所有できます。

ファイルが別のプロセスで LOCK_SH でロックされている場合、LOCK_SH での flock は成功します。LOCK_EX を指定した flock は、すべてのリーダー ロックが解除されるまでブロックします。

http://php.net/manual/en/function.flock.php#78318

于 2013-12-08T10:50:53.450 に答える