10

PHP 文档对此有点模糊,所以我在这里问它。鉴于此工作人员代码:

<?php
$gmworker= new GearmanWorker();
$gmworker->addServer();
$gmworker->addFunction("doSomething", "doSomethingFunc");
while($gmworker->work());

function doSomethingFunc()
{
    try {
        $value = doSomethingElse($job->workload());
    } catch (Exception $e) {
        // Need to notify the client of the error
    }

    return $value;
}

通知客户发生的任何错误的正确方法是什么?返回假?使用 GearmanJob::sendFail()?如果是后者,我是否需要在调用 sendFail() 后从我的 doSomethingFunc() 返回?返回值应该是 sendFail() 返回的值吗?

客户端使用 GearmanClient::returnCode() 来检查失败。此外,简单地使用“return $value”似乎可行,但我应该使用 GearmanJob::sendData() 还是 GearmanJob::sendComplete() 代替?

4

1 回答 1

9

这可能不是最好的方法,但这是我过去使用的方法,对我来说效果很好。

我在工作人员中使用 sendException() 后跟 sendFail() 来返回作业失败。异常部分是可选的,但我使用它以便客户端可以出错并大致知道它失败的原因。在 sendFail 之后,我什么也不返回。例如,这是一个工人注册为回调的方法:

public function doJob(GearmanJob $job)
{
    $this->_gearmanJob = $job;


    try{
        //This method does the actual work
        $this->_doJob($job->functionName());
    }
    catch (Exception $e) {
        $job->sendException($e->getMessage());
        $job->sendFail();
    }
}

在 sendFail() 之后不要返回任何其他内容,否则您可能会得到奇怪的结果,例如作业服务器认为作业正常结束。

关于返回数据,如果我在工作期间以不同的时间间隔以块的形式返回数据(例如流式转码视频,或任何我不想在一个大块周围移动的“大”数据),我会使用 sendData()最后一个 sendComplete()。否则,如果我只想在作业结束时一次性返回我的数据,我只使用 sendComplete()。

希望这可以帮助。

于 2011-03-16T20:59:37.120 回答