に見られるような、ブロッキング ロックと非ブロッキング ロックの両方の排他的/共有を使用したいと考えていますflock()
。セマフォを使用してこれをどのように達成できますか?
質問する
533 次
1 に答える
-1
ユースケースによって異なります。
サーバーが1つしかない場合は、ロックファイルを使用してください。
function doSomething() {
$file = /temp/path/somthing.lock;
if (file_exists($file)) {
return false;
}
touch($file);
// Safely mess with things
unlink($file);
}
ロードバランサーの背後など、複数のWebサーバーがある場合は、mysqlのテーブルを使用して同じことを実行できます。
function doSomething() {
$query = "SELECT * FROM locks WHERE name='something'");
$res = mysqli_query($query);
if (mysql_num_rows($res) > 0) {
return false;
}
$query = "INSERT INTO locks (name) VALUES ('something')";
mysqli_query($query);
// Safely mess with things
$query = "DELETE FROM locks WHERE name='something'");
mysqli_query($query);
}
Memcacheは、複数のマシンをサポートするもう1つの明らかな候補です。
ACPはキャッシュのみを目的としているため、使用しないでください。これは、ACPストレージがいつ削除されるかを制御できないことを意味し、いつでも発生する可能性があります。
セマフォを使用することもできますが、複数のサーバーを使用する場合は、ロックファイルの場合と同じ注意事項が適用されます。
lock($key)
、is_locked($key)
およびrelease($key)
関数を作成し、プロジェクト全体でそれらを忠実に使用することをお勧めします。そうすれば、ロックファイルから始めることができますが(実装は簡単です)、コードの残りの部分を編集せずに、後でより良いものにアップグレードできます。本当に凝ったものにしたい場合は、コードの既知の場所に配置するロガーオブジェクトのメソッドとしてそれらを実装できます。
于 2013-03-23T14:58:10.337 に答える