这个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()?
答案 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()。
希望这有帮助。