这个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()?
这可能不是最好的方法,但它是我过去使用的方法,它对我来说效果很好.
我在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().
希望这可以帮助.