PHP非阻塞独占锁

时间:2013-03-23 14:40:04

标签: php locking flock

我想使用flock()中的独占/共享,阻塞和非阻塞锁定。如何使用信号量实现这一目标?

1 个答案:

答案 0 :(得分:-1)

这取决于用例。

如果您只在一台服务器上,请使用锁定文件。

function doSomething() {
  $file = /temp/path/somthing.lock;
  if (file_exists($file)) {
    return false;
  }
  touch($file);
  // Safely mess with things
  unlink($file);
}

如果您有多个网络服务器,例如在负载均衡器后面,使用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是​​另一个有多台机器支持的明显候选人。

您不应该使用ACP,因为它仅用于缓存。这意味着当ACP存储被删除时您无法控制,它可能随时发生。

您也可以使用信号量,但如果您使用多个服务器,则与锁定文件的注意事项相同。

我建议您创建lock($key)is_locked($key)release($key)函数,然后在整个项目中虔诚地使用它们。这样你就可以从锁定文件开始(快速实现),但随后升级到更好的东西,而无需编辑其余的代码。如果你想变得非常花哨,可以将它们作为记录器对象的方法实现,放在代码的已知位置。