我一直在运行一个Gearman作业服务器,它有多个工作线程,每天都会被调用多次(10k+ x一小时),没有任何问题。
我最近添加了3个不经常被调用的新员工(每天3-6次)。新的工作进程似乎会随机断开与gearman服务器的连接(有时是一天一次,有时是在他们完成一项工作之后),但让PHP进程保持运行,这意味着没有致命错误,它们只是作为gearman工作进程不可用。
错误日志基本上是正确的,但是我在其中一个日志中看到了以下警告:警告: GearmanWorker::work():flush(连接超时) send -> libgearman/connection.cc:847
我找不到任何与这个问题相关的东西,想问几个问题:
1)这个错误也指的是什么?工人超时,也就是工作时间太长了?或者服务器超时,意味着它空闲了很长时间,以至于它与Gearman服务器断开了连接?有什么可以通过将GearmanWorker::setTimeout设置为-1来修复的吗?
1.1)如果我没有明确设置超时,gearman是否有默认超时?
2)齿轮工是否应该定期重启?
3)这是否与worker的返回值有关?我总是返回布尔值,"false“会断开服务器连接吗?
注意:与我的其他工人不同,这个工人被客户称为"do background“。
谢谢你的帮助!
发布于 2015-09-08 09:50:13
最近我自己遇到了这个问题,找不到解决方案。我想我会发布我的修复,让下一个人找到这个页面。在worker代码中,我向while循环添加了对超时条件的检查,并强制它退出脚本:
while($worker->work() || $worker->returnCode() == GEARMAN_TIMEOUT)
{
if($worker->returnCode() == GEARMAN_TIMEOUT)
{
echo "Timeout.\n";
exit(0);
}
}然后,我使用Supervisor保持worker脚本运行。当supervisor进程检测到脚本已死时,它会自动重新启动该脚本。不再有工作人员断开连接的问题。它不是很优雅,但它完成了工作。
https://stackoverflow.com/questions/22758869
复制相似问题