【问题标题】:Gearman client doBackground always returns GEARMAN_TIMEOUTGearman 客户端 doBackground 总是返回 GEARMAN_TIMEOUT
【发布时间】:2012-10-15 22:56:55
【问题描述】:

所以,我现在正在运行一个简单的齿轮系统,一个工人在运行。

worker 基本上只是获取有效负载(在这种情况下是一个随机数,并且应该将其回显到屏幕上。字面意思是 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"
  }

【问题讨论】:

  • 如果你正在运行多个服务器,请确保两者都可以使用 gearman 实例 ping 服务器。
  • 目前只有一台服务器
  • 能把echo线的内容贴一下吗? echo "Method: $method \t Worker: {$this->getName()} \t Payload: {$this->getPayload()} \t Hash: {$this->getHash()}\n"; ?
  • 尝试将$method var 括在大括号中; $this->getClient()->{$method}(
  • 看看这篇文章是否有帮助:stackoverflow.com/questions/7076200/…

标签: php gearman


【解决方案1】:

解决了。

连接没有跨方法持续存在......所以,构建一个服务器池,并在运行作业之前连接到服务器

【讨论】:

    【解决方案2】:

    如果您的gearmand 在另一个端口上,请确保AddServers 知道,否则GEARMAN_TIMEOUT。

    gearmand -d -p 4769

    $worker->addServers(127.0.0.1:4769);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多