当工作人员因致命错误而失败时,我无法捕获此错误,因此我无法将结果发送到gearman服务器,并且服务器不会从队列中删除作业并且它再次尝试执行此作业,主管重新启动工作人员和工作人员失败agian 。所以我可以在重启服务器之前收到无限循环:
gearman向工作人员发送工作 - >工人因致命错误而失败 - >工作没有从队列中删除 - >主管重启工人 - > gearman向工作人员发送工作 - > ...
(当然,只有我无法在php中快速修复错误)。如何从队列中删除此作业(或以其他方式解决此问题)?
简单示例:
$worker->addFunction('test', 'test');
while($worker->work());
function test()
{
$a = [];
//fatal error
$a->fatal();
}
答案 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());