2

に見られるような、ブロッキング ロックと非ブロッキング ロックの両方の排他的/共有を使用したいと考えていますflock()。セマフォを使用してこれをどのように達成できますか?

4

1 に答える 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 に答える