2013-07-03 40 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(); 
    }