【问题标题】:Catch fatal error on gearman php workers在 gearman php 工作人员上捕获致命错误
【发布时间】:2014-10-23 08:01:28
【问题描述】:

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

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

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

简单示例:

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

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

【问题讨论】:

  • 请贴一些代码
  • whiiiiiiiiiiiiiiiiiiiiile

标签: php worker gearman


【解决方案1】:

如果您像我一样进入搜索方法来捕获致命错误并将其发送回工作人员。 所以,你需要使用函数 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";
}

【讨论】:

    【解决方案2】:

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

    while($worker->work());
    

    【讨论】:

    • 你搞错了,另一种死循环:)
    猜你喜欢
    • 2023-02-12
    • 2011-01-20
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2018-10-11
    • 2022-12-03
    • 2016-01-27
    • 1970-01-01
    相关资源
    最近更新 更多