我一直在运行一个有多个工作人员的Gearman作业服务器,每天都会多次调用(10k + x小时)而没有任何问题。
我最近增加了3名经常被调用的新工人(每天3-6次)。似乎新工作人员似乎是随机的(有时一天一次,有时候他们完成一项工作后)与齿轮服务器断开连接,但是让PHP流程继续运行,这意味着没有致命错误,它们只会变得不可用齿轮工人。
错误日志大部分都是正确的,但我在其中一个日志上看到以下警告: 警告:GearmanWorker :: work():flush(连接超时)发送 - > libgearman / connection.cc:847
我无法找到与此问题相关的任何内容,并想提出几个问题:
1)这个错误也指的是什么?工人超时,即工作花了太长时间?或服务器超时意味着它已经闲置了很长时间,以至于它与Gearman Server断开连接?有没有什么可以通过使用GearmanWorker :: setTimeout到-1?
来修复1.1)如果我没有明确设置超时,齿轮手是否是默认超时?
2)齿轮工人应该定期重新启动吗?
3)这可能与工人的回报价值有关吗?我总是返回布尔值,是"假"断开服务器?
注意:与我的其他员工不同,这些员工被客户称为"做背景"
感谢您的帮助!
答案 0 :(得分:0)
我最近自己遇到了这个问题,无法找到解决方案。以为我会为下一个人发布我的修复程序以找到此页面。在worker代码中,我添加了一个检查到while循环的超时条件,并强制它退出脚本:
while($worker->work() || $worker->returnCode() == GEARMAN_TIMEOUT)
{
if($worker->returnCode() == GEARMAN_TIMEOUT)
{
echo "Timeout.\n";
exit(0);
}
}
然后我让工作人员脚本与Supervisor一起运行。当主管进程检测到脚本已经死亡时,它会自动重新启动它。没有更多的问题与工人断开连接。它不是很优雅,但它完成了工作。