PHP 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();
} 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
当客户端无法连接到服务器时如何捕获错误?
最佳答案
我们添加了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
永远不会被扔进我们的设置中。
关于php - 当 PHP Gearman 客户端无法连接到服务器时,我得到与无法获取新作业时相同的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815420/