我想使用排他/共享,阻塞和非阻塞锁,就像flock()
. 如何使用信号量来实现这一点?
问问题
533 次
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 是另一个具有多机支持的明显候选者。
您不应使用 ACP,因为它仅用于缓存。这意味着您无法控制 ACP 存储何时被删除,它可能随时发生。
您也可以使用信号量,但是如果您使用多个服务器,则应用与锁定文件相同的警告。
我建议创建lock($key)
,is_locked($key)
和release($key)
函数,然后在整个项目中虔诚地使用它们。这样您就可以从锁定文件开始(快速实施),然后在不编辑其余代码的情况下升级到更好的东西。如果您想真正花哨,可以将它们实现为记录器对象的方法,并将其放在代码的已知位置。
于 2013-03-23T14:58:10.337 回答