php - 齿轮人和 PHP : Proper Way For a Worker to Send Back a Failure

标签 php gearman

PHP 文档对此有点模糊,所以我在这里提问。鉴于此 worker 代码:

<?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()?

最佳答案

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

我在工作程序中使用 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() 之后不要返回任何其他内容,否则您可能会得到奇怪的结果,例如作业服务器认为作业正常结束。

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

希望这对您有所帮助。

关于php - 齿轮人和 PHP : Proper Way For a Worker to Send Back a Failure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5143755/

相关文章:

php - 编写 PHP 批处理程序时的 Gearman 与 Redis

java - PHP-Java 互操作 - Gearman 还是 PJB?

php - 测试 Gearman/MySQL - 持久层

php - 如何检查列值是否在字符串 SQL 中

php - 如何使用 MySQL Left Join 根据另一个表行的 id 获取结果?

php - 将整个网站重定向到 HTTPS

php - Gearman:从后台 worker 向客户端发送数据

php - 在 Woocommerce 中设置购物车商品价格后重新计算总计

php - $result->num_rows 总是返回 0

logic - 为什么这个循环在使用 && 而不是 'and' 时返回 1?