确定适当的齿轮手任务功能以检索实时工作状态

时间:2013-02-06 16:03:12

标签: php client real-time gearman worker

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

我知道我需要将这个齿轮工作作为后台进程运行,但是我很难找到适当的解决方案来获得关于工人何时实际完成流程的实时状态更新。我使用了PHP示例中的以下代码片段:

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中提取多个数据Feed(某些Feed需要的时间比其他Feed长)
  2. 加载一些总是加载速度快的动画,在发送到工作人员队列的部分放置“等待/加载”动画
  3. 完成工作并完全检索结果后,将动画替换为结果

1 个答案:

答案 0 :(得分:2)

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

首先,请参阅GearmanClient::jobStatus上的文档。这将从客户端调用,函数接受一个参数:$job_handle。您在分派请求时检索此句柄:

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

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

$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