我想使用flock()
中的独占/共享,阻塞和非阻塞锁定。如何使用信号量实现这一目标?
答案 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)
函数,然后在整个项目中虔诚地使用它们。这样你就可以从锁定文件开始(快速实现),但随后升级到更好的东西,而无需编辑其余的代码。如果你想变得非常花哨,可以将它们作为记录器对象的方法实现,放在代码的已知位置。