所以,我现在有一个简单的齿轮系统运行,工人正在运行。
工作人员基本上只接受有效负载(在这种情况下是一个随机数,并且应该将其回显到屏幕上。字面意思是echo
,而不是返回客户端。
客户端发送随机数。我试图做$client->doBackground( 'post', 65482, md5(uniqid()));
,但每次都会出现47错误(GEARMAN_TIMEOUT
)。
getErrNo()
返回0,error()
返回GEARMAN_TIMEOUT
但是,当我将其更改为$client->do(blah, blah, blah)
时,它可以正常工作。
即使在收到超时错误之后,我甚至偶尔会看到工作人员仍在回显数字......
public function execute()
{
$method = 'do';
if( !$this->getBlock() )
{
$method .= ( $this->getPriority() == 'Normal' ? '' : $this->getPriority() ) . 'Background';
}
else
{
$method .= $this->getPriority();
}
echo "Method: $method \t Worker: {$this->getName()} \t Payload: {$this->getPayload()} \t Hash: {$this->getHash()}\n";
$this->setResult(
$this->getClient()
->$method(
$this->getName(),
$this->getPayload(),
$this->getHash()
)
);
if( $this->getClient()->returnCode() != GEARMAN_SUCCESS )
{
echo "Code: " . $this->getClient()->returnCode() . "\t" . GEARMAN_TIMEOUT . "\n";
}
}
回声带回来
Method: doHighBackground Worker: leadposter Payload: 10930 Hash: 091878f5965e4a1de2992c607b3c562b240792a6
见下错误信息
["error":"Uecode\GearmanBundle\Gearman\Job":private]=>
array(4) {
["attempts"]=>
int(3)
["return_code"]=>
int(47)
["error_no"]=>
int(0)
["error"]=>
string(103) "gearman_wait(GEARMAN_TIMEOUT) timeout reached, no servers were available -> libgearman/universal.cc:325"
}
答案 0 :(得分:0)
解决了它。
连接不是跨方法持久...因此,构建服务器池,并在运行作业之前连接到服务器
答案 1 :(得分:0)
如果您的gearmand
在另一个端口上,请确保AddServers
知道,否则GEARMAN_TIMEOUT
会知道。
gearmand -d -p 4769
$worker->addServers(127.0.0.1:4769);