我一直在运行一个gearman作业服务器,它有多个工人,每天都会接到多次电话(10k+x一小时),没有任何问题。
我最近又增加了3名不常被称为“新员工”(每天3-6名)。看起来,新的工作人员与gearman服务器的断开连接是随机的(有时是一天一次,有时是在他们完成一项工作之后),但是让php进程继续运行,这意味着没有致命的错误,他们只是作为gearman工作人员变得不可用。
错误日志基本正确,但我在其中一个日志上看到以下警告:
警告:gearmanworker::work():刷新(连接超时)发送->libgearman/connection.cc:847
我找不到与这个问题相关的任何东西,我想问几个问题:
1)这个错误指的是什么?工人超时即工作时间过长?或者服务器超时意味着它空闲了很长时间,以至于它与gearman服务器断开了连接?使用gearmanworker::setTimeout到-1有什么可以修复的吗?
1.1)如果我没有明确设置超时,那么Gearman是否有默认超时?
2)齿轮工是否应定期重新启动?
3)这是否与工人的回报价值有关?我总是返回布尔值,“false”会断开服务器连接吗?
注:与我的其他员工不同,这些员工被客户称为“做背景”
谢谢你的帮助!

最佳答案

我最近碰到这个问题,找不到解决办法。我想我会把我的修正贴给下一个找到这页的人。在工作代码中,我为while循环添加了一个超时条件检查,并强制它退出脚本:

while($worker->work() || $worker->returnCode() == GEARMAN_TIMEOUT)
{
  if($worker->returnCode() == GEARMAN_TIMEOUT)
  {
    echo "Timeout.\n";
    exit(0);
  }

}

然后我与主管一起运行工作脚本。当主管进程检测到脚本已终止时,它将自动重新启动脚本。不再有工人断开连接的问题。它不是很优雅,但它完成了任务。

关于php - Gearman worker 定期断开连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22758869/

10-10 09:44