Gearman&PHP:工人发回失败的正确方法

mel*_*oon 10 php gearman

这个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;
}
Run Code Online (Sandbox Code Playgroud)

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

客户端使用GearmanClient :: returnCode()来检查故障.另外,简单地使用"return $ value"似乎有效,但是我应该使用GearmanJob :: sendData()还是GearmanJob :: sendComplete()?

Jam*_*ler 8

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

我在worker中使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在sendFail()之后不返回任何其他内容,否则您可能会得到奇怪的结果,例如jobserver认为作业结束了.

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

希望这可以帮助.