【问题标题】:determining proper gearman task function to retrieve real-time job status确定适当的 gearman 任务函数以检索实时作业状态
【发布时间】:2013-02-06 16:03:11
【问题描述】:

非常简单,我有一个程序需要执行一个大型进程(从 5 秒到几分钟不等),我不想让我的页面等待进程完成加载。

我知道我需要将这个 Gearman 作业作为后台进程运行,但我正在努力寻找合适的解决方案,以获取有关工作人员何时真正完成进程的实时状态更新。我使用了 PHP 示例中的以下代码 sn-p:

do {
    sleep(3);
    $stat = $gmclient->jobStatus($job_handle);
    if (!$stat[0]) // the job is known so it is not done
        $done = true;
        echo "Running: " . ($stat[1] ? "true" : "false") . ", numerator: " . $stat[2] . ", denomintor: " . $stat[3] . "\n";
} while(!$done);

echo "done!\n";

这是可行的,但是它似乎只是在工作人员完成告诉作业要做什么时才将数据返回给客户端。相反,我想知道job 的文字处理何时完成。

我的真实例子:

  1. 从一个 API 中提取多个数据馈送(某些馈送需要的时间比其他馈送长)
  2. 加载几个总是加载速度很快的,在发送到工作队列的部分放置“等待/加载”动画
  3. 工作完成并完全检索结果后,将动画替换为结果

【问题讨论】:

  • 来晚了,但如果这是对您问题的解决方案,请接受答案。

标签: php client real-time gearman worker


【解决方案1】:

这有点晚了,但我偶然发现了这个问题,寻找相同的答案。我能够一起找到解决方案,所以也许它会帮助其他人。

对于初学者,请参阅GearmanClient::jobStatus 上的文档。这将从客户端调用,并且该函数接受一个参数:$job_handle。您在分派请求时检索此句柄:

$client = new GearmanClient( );
$client->addServer( '127.0.0.1', 4730 );
$handle = $client->doBackground( 'serviceRequest', $data );

稍后,您可以通过在同一 $client 对象上调用 jobStatus 函数来检索状态:

$status = $client->jobStatus( $handle );

不过,这只有在您使用 sendStatus 方法从工作人员内部实际更改状态时才有意义:

$worker = new GearmanWorker( );
$worker->addFunction( 'serviceRequest', function( $job ) {
    $max = 10;
    // Set initial status - numerator / denominator
    $job->sendStatus( 0, $max );

    for( $i = 1; $i <= $max; $i++ ) {
        sleep( 2 ); // Simulate a long running task
        $job->sendStatus( $i, $max );
    }

    return GEARMAN_SUCCESS;
} );

while( $worker->work( ) ) {
    $worker->wait( );
}
  • 在 0.5 之前的 Gearman 版本中,您可以使用 GearmanJob::status 方法来设置作业的状态。版本 0.6 到当前 (1.1) 使用上述方法。

  • 另请参阅此问题:Problem With Gearman Job Status

【讨论】:

  • 我确信这可能是正确的。对于现在的后台处理,我个人使用PusherIronWorker取得了很大的成功。
猜你喜欢
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多