PHP-避免由两个工作人员同时运行后台作业
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PHP-避免由两个工作人员同时运行后台作业,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1937字,纯文字阅读大概需要3分钟。
内容图文
![PHP-避免由两个工作人员同时运行后台作业](/upload/InfoBanner/zyjiaocheng/686/2dcc802ebfc24bad99604251b95005ca.jpg)
我有一个守护程序,运行我们的Web服务请求的后台作业.我们有4个工人同时运行.
有时,一个作业同时执行两次,因为两个工人决定运行该作业.为了避免这种情况,我们尝试了几件事:
>因为我们的工作来自数据库,所以我们添加了一个称为execute的标志,该标志防止其他工作获得已经开始执行的工作;这不能解决问题,有时我们数据库的延迟足以同时执行.
>在系统中添加了memcached(所有工作程序都在同一个系统中运行),但是由于某种原因,我们今天同时运行了多个作业-memcached不能同时解决多台服务器的问题.
这是我们当前正在使用的以下逻辑:
// We create our memcached server
$memcached = new Memcached();
$memcached->addServer("127.0.0.1", 11211);
// Checkup every 5 seconds for operations
while (true) {
// Gather all operations TODO
// In this query, we do not accept operations that are set
// as executed already.
$result = findDaemonOperationsPendingQuery();
// We have some results!
if (mysqli_num_rows($result) > 0) {
$op = mysqli_fetch_assoc($result);
echo "Found an operation todo #" . $op['id'] . "\n";
// Set operation as executed
setDaemonOperationAsDone($op['id'], 'executed');
// Verifies if operation is happening on memcached
if (get_memcached_operation($memcached, $op['id'])) {
echo "\tOperation id already executing...\n";
continue;
} else {
// Set operation on memcached
set_memcached_operation($memcached, $op['id']);
}
... do our stuff
}
}
通常如何解决这种问题?
我上网查找了一个名为Gearman的库,但是我不相信当我们有多台服务器时,它可以解决我的问题.
我想到的另一件事是预定义一个守护程序以在插入时运行该操作,并创建一个故障安全的独占守护程序,该守护程序运行由停止运行的守护程序设置的操作.
有任何想法吗?
谢谢.
解决方法:
假设每个工作人员都有一个ID,这是使用锁和事务的一种替代解决方案.
在循环中运行:
UPDATE operations SET worker_id = :wid WHERE worker_id IS NULL LIMIT 1;
SELECT * FROM operations where executed = 0 and worker_id = :wid;
该更新是单个操作,它是原子操作,您仅在尚未设置worker_id的情况下进行设置,因此不必担心竞争状况.设置worker_id可以清楚地知道谁拥有该操作.由于LIMIT 1,此更新将只分配一项操作.
内容总结
以上是互联网集市为您收集整理的PHP-避免由两个工作人员同时运行后台作业全部内容,希望文章能够帮你解决PHP-避免由两个工作人员同时运行后台作业所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。