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

时间:2011-02-28 15:12:17

标签: 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;
}

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

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

1 个答案:

答案 0 :(得分: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();
    }
}

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

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

希望这有帮助。