在gearman php工作程序上捕获致命错误


Catch fatal error on gearman php workers

当worker作业因致命错误而失败时,我无法捕捉到此错误,因此我无法将结果发送到gearman服务器,并且服务器没有从队列中删除作业,它尝试再次执行此作业,主管重新启动worker,worker失败。所以我可以接收无限循环,直到重新启动服务器:

gearman将作业发送到工人->工人因致命错误而失败->作业未从队列中删除->主管重新启动工人->gearman发送作业到工人->。。。

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

简单示例:

$worker->addFunction('test', 'test');
while($worker->work());
function test()
{
  $a = [];
  //fatal error
  $a->fatal();
}

如果您像我一样输入搜索一个方法来捕获致命错误并将其发送回工作者。因此,您需要使用函数set_exception_handle和set_error_handlehttp://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";
}

此行正在创建一个无限循环:

while($worker->work());