抓住齿轮工人php工人的致命错误

时间:2014-10-23 08:01:29

标签: php worker gearman

当工作人员因致命错误而失败时,我无法捕获此错误,因此我无法将结果发送到gearman服务器,并且服务器不会从队列中删除作业并且它再次尝试执行此作业,主管重新启动工作人员和工作人员失败agian 。所以我可以在重启服务器之前收到无限循环:

gearman向工作人员发送工作 - >工人因致命错误而失败 - >工作没有从队列中删除 - >主管重启工人 - > gearman向工作人员发送工作 - > ...

(当然,只有我无法在php中快速修复错误)。如何从队列中删除此作业(或以其他方式解决此问题)?

简单示例:

$worker->addFunction('test', 'test');
while($worker->work());

function test()
{
  $a = [];
  //fatal error
  $a->fatal();
}

2 个答案:

答案 0 :(得分:0)

如果您像我一样输入搜索致命错误的方法并将其发回给工作人员。 因此,您需要使用函数set_exception_handle和set_error_handle http://php.net/manual/en/function.set-exception-handler.php

然后,您应该在您的客户端中实现failCallback和exceptionCallback以捕获这些失败。 在Worker上,您必须添加一个发回异常的函数。

public function exception_handler($exception) {

    $this->job->sendException('Boom');

}

客户端将在回调中捕获异常

public function verifyExceptionTask (GearmanTask $task) {
    $m = $task->data();
    echo "ID Unique: " . $task->unique() . "\n";
    echo "Exception: {$m} " . GEARMAN_WORK_EXCEPTION . "\n";
}

答案 1 :(得分:-1)

这一行正在创造一个无限循环:

while($worker->work());