2013-02-06 35 views
1

很簡單,我有一個程序,需要進行大量的過程(從5秒鐘到幾分鐘不等),我不想讓我的網頁等待該過程完成加載。確定適當的Gearman任務函數來獲取實時作業狀態

我明白,我需要運行這個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"; 

和這個作品,但是似乎它只是數據返回到客戶端時,工作人員講完的工作要做什麼。相反,我想知道job的字面過程何時完成。

我的現實生活中的例子:

  1. 拉幾個數據從API(一些飼料花費比別人更長的時間)
  2. 裝載一對夫婦的人的總是加載速度不夠快,將「等待供稿/加載」動畫上被罰下的工人隊列的部分
  3. 當工作完成後,結果已經完全取出,用成績代替動畫
+0

比較晚,但請接受的答案,如果這是一個sollution你的問題。 –

回答

2

這是一個有點升吃了,但我偶然發現了這個問題尋找相同的答案。我能夠一起得到一個解決方案,所以也許它會幫助別人。

對於初學者來說,是指對文檔的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

+0

我相信這可能是對的。對於現在的後臺處理,我個人使用[Pusher](http://pusher.com)和[IronWorker](http://www.iron.io/worker)取得了巨大成功。 –