1

非常に簡単に言えば、大規模なプロセス (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 から複数のデータ フィードを取得します (一部のフィードは他よりも時間がかかります)
  2. 常に高速にロードするものをいくつかロードし、ワーカー キューに送信されたセクションに「待機中/ロード中」アニメーションを配置します。
  3. 作業が完了し、結果が完全に取得されたら、アニメーションを結果に置き換えます
4

1 に答える 1

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) までは、上記の方法を使用します。

  • この質問も参照してください: Gearman ジョブ ステータスの問題

于 2013-11-04T10:35:29.883 に答える