2013-07-03 42 views
1

我在第一次設置L4隊列時遇到了一些問題。 我有我喜歡這種簡單的控制器方法:Laravel 4 Queue的問題

public function getIndex() 
{ 
    $data = array(
     'offset' => 3300000, 
     'site' => 1 
    ); 
    Queue::push('[email protected]', $data); 
    return 'OK!'; 
} 

在工作方法的底部,我做這樣的事情:

public function jobmethod() 
{ 
    .... 
    $data = array(
     'offset' => $data['offset'] + 100, 
     'site' => $data['site'] 
    ); 
    Queue::push('[email protected]', $data); 
    $job->delete(); 
} 

所以工作通過隊列循環再次以更高抵消。 現在我的問題是,當我在瀏覽器中調用控制器方法時,它永遠不會返回OK!,但只是繼續加載頁面?我將這項工作設置爲登錄數據庫表,我可以看到它一直運行多次。

有沒有人有關於這裏發生了什麼的想法?

回答

9

我想你有你的默認隊列處理程序設置爲「同步」。你可以在app/config/queue.php中查看。

這樣做是直接處理事件,因爲沒有安裝實際的隊列。

因此,在你的情況下,它會不斷運行jobmethod,因爲它不斷迭代相同的函數。如果刪除jobmethod中的隊列推送,它將返回OK。

因此,要做到這一點,你必須安裝像Beanstalkd這樣的排隊系統。如果你這樣做,確保你在composer.json的require部分添加"pda/pheanstalk": "dev-master"

如果你想運行隊列,檢查我的回答這個問題:How to fire Laravel Queues with beanstalkd

+0

對!謝謝尼科。 – Stromgren

3

我認爲你正在進入一個無限遞歸

public function getIndex() 
{ 
    $data = array(
     'offset' => 3300000, 
     'site' => 1 
    ); 
    Queue::push('[email protected]', $data); //Here you push the job to the queue 
    return 'OK!'; 
} 


public function jobmethod() 
{ 
    .... 
    $data = array(
     'offset' => $data['offset'] + 100, 
     'site' => $data['site'] 
    ); 
    Queue::push('[email protected]', $data); //This is creating infinite recursion!!! 
    $job->delete(); 
} 

考慮這個變種:

public function getIndex() 
    { 
     $data = array(
      'offset' => 3300000, 
      'site' => 1 
     ); 
     Queue::push('[email protected]', $data); //Here you push the job to the queue 
     return 'OK!'; 
    } 


    public function jobmethod($data) 
    { 
     .... 
     //Queue::push('[email protected]', $data); //This is creating infinite recursion!!! 
     $job->delete(); 
    }