2

PHP Gearman worker 从服务器检索任务。当我们没有任何新任务时,我们会在后台做一些其他的工作。请检查下面的实现。

$worker = new GearmanWorker();
$worker->addServer('host', 123);
$worker->addFunction('name', array($this, 'function'));
$worker->setTimeout(5000);

while ($worker->work() || GEARMAN_TIMEOUT == $worker->returnCode()) {
    if (GEARMAN_TIMEOUT == $worker->returnCode()) {
        $this->handleTimeout();
    } elseif (GEARMAN_SUCCESS != $worker->returnCode()) {
        $this->handleFail();
        break;
    }
}

代码看起来很简单,大部分时间都可以正常工作。但是当由于某种原因脚本无法连接到服务器时,$worker->returnCode()等于GEARMAN_TIMEOUT.

$worker->returnCode()值是一样的

  • 当我们没有任何新任务时
  • 当脚本无法连接到服务器时

当脚本无法连接到服务器时,错误消息和代码如下:

  • $worker->error()

    gearman_worker_grab_job(GEARMAN_TIMEOUT) 达到选项超时返回 -> libgearman/worker.cc:869

  • $worker->getErrno()

    0

当客户端无法连接到服务器时如何捕获错误?

4

2 回答 2

2

我们添加GearmanWorker::echo()了检查 Gearman 服务器是否可用的调用。

修改后看代码

$worker = new GearmanWorker();
$worker->addServer('host', 123);
$worker->addFunction('name', array($this, 'function'));
$worker->setTimeout(5000);

while ($worker->work() || GEARMAN_TIMEOUT == $worker->returnCode()) {
    if (GEARMAN_TIMEOUT == $worker->returnCode()) {
        $this->handleTimeout();
        $echo = @$worker->echo(1);
        if (!$echo) {
            echo 'Failed to connect to Gearman Gerver.'. PHP_EOL;
            break;
        }
    } elseif (GEARMAN_SUCCESS != $worker->returnCode()) {
        $this->handleFail();
        break;
    }
}

请注意$echo = @$worker->echo(1);下面的线路和检查。如果服务器不可用,则echo()输出 PHP 警告并返回false

GearmanException永远不会在我们的设置中抛出。

于 2013-06-11T09:08:24.607 回答
1

对于基本解决方案,您可以使用如下代码:

try {
while ($worker->work() || GEARMAN_TIMEOUT == $worker->returnCode()) {
    if (GEARMAN_TIMEOUT == $worker->returnCode()) {
        echo "Timeout...\n";
    } elseif (GEARMAN_SUCCESS != $worker->returnCode()) {
        echo "Fail...\n";
        break;
    }
}
} catch (GearmanException $e) {
  echo "Exception caused!\n";
}

但是你不能让工人活着,因为它需要连接。我建议使用 Supervisord 自动重启工作人员。

于 2013-06-07T07:02:38.093 回答