Php 确定合适的gearman任务函数以检索实时作业状态
很简单,我有一个程序需要执行一个大的进程(从5秒到几分钟不等),我不想让我的页面等待进程完成加载 我知道我需要将gearman作业作为后台进程运行,但我正在努力确定适当的解决方案,以获取实时状态更新,从而了解工作人员何时实际完成该进程。我使用了PHP示例中的以下代码片段:Php 确定合适的gearman任务函数以检索实时作业状态,php,client,real-time,gearman,worker,Php,Client,Real Time,Gearman,Worker,很简单,我有一个程序需要执行一个大的进程(从5秒到几分钟不等),我不想让我的页面等待进程完成加载 我知道我需要将gearman作业作为后台进程运行,但我正在努力确定适当的解决方案,以获取实时状态更新,从而了解工作人员何时实际完成该进程。我使用了PHP示例中的以下代码片段: do { sleep(3); $stat = $gmclient->jobStatus($job_handle); if (!$stat[0]) // the job is known so it
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";
这是可行的,但是当工作人员完成告诉工作要做什么时,它似乎只是将数据返回给客户机。相反,我想知道作业的文本过程何时完成
我的真实例子:
从API中提取多个数据源(某些源比其他源耗时更长)
加载两个总是快速加载的,在发送到工作队列的部分上放置“等待/加载”动画
完成工作并完全检索结果后,用结果替换动画
这有点晚了,但我无意中发现了这个问题,寻找相同的答案。我能够找到一个解决方案,所以也许它会帮助其他人
对于初学者,请参阅上的文档。这将从客户端调用,函数接受一个参数:$job\u handle
。在分派请求时检索此句柄:
$client = new GearmanClient( );
$client->addServer( '127.0.0.1', 4730 );
$handle = $client->doBackground( 'serviceRequest', $data );
稍后,您可以通过在同一$client
对象上调用jobStatus
函数来检索状态:
$status = $client->jobStatus( $handle );
但是,这只有在您实际使用以下方法从worker内部更改状态时才有意义:
$worker=new GearmanWorker();
$worker->addFunction('serviceRequest',function($job){
$max=10;
//设置初始状态-分子/分母
$job->sendStatus(0,$max);
对于($i=1;$i sendStatus($i,$max);
}
返回GEARMAN_成功;
} );
而($worker->work()){
$worker->wait();
}
- 在0.5之前的Gearman版本中,可以使用GearmanJob::status方法设置作业的状态。0.6到当前(1.1)版本使用上述方法
- 另见这个问题:
已经很晚了,但如果这是对您问题的解决方案,请接受答案。我相信这可能是正确的。对于现在的后台处理,我个人使用并取得了巨大成功。
$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( );
}