Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 确定合适的gearman任务函数以检索实时作业状态_Php_Client_Real Time_Gearman_Worker - Fatal编程技术网

Php 确定合适的gearman任务函数以检索实时作业状态

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

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

我知道我需要将gearman作业作为后台进程运行,但我正在努力确定适当的解决方案,以获取实时状态更新,从而了解工作人员何时实际完成该进程。我使用了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";
这是可行的,但是当工作人员完成告诉工作要做什么时,它似乎只是将数据返回给客户机。相反,我想知道
作业的文本过程何时完成

我的真实例子:

  • 从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( );
    }