我是第一次在L4中设置队列,我遇到了一些问题。 我有这样简单的控制器方法:
public function getIndex()
{
$data = array(
'offset' => 3300000,
'site' => 1
);
Queue::push('Class@jobmethod', $data);
return 'OK!';
}
在工作方法的底部,我做了类似的事情:
public function jobmethod()
{
....
$data = array(
'offset' => $data['offset'] + 100,
'site' => $data['site']
);
Queue::push('Class@jobmethod', $data);
$job->delete();
}
因此,作业再次以更高的偏移量循环遍历队列。 现在我的问题是,当我在浏览器中调用控制器方法时,它将永远不会返回OK!,但只是继续加载页面?我将作业设置为登录数据库表,我可以看到它持续运行了几次。
有没有人对这里发生的事情有所了解?
答案 0 :(得分:9)
我猜你的默认队列处理程序设置为“sync”。您可以在app / config / queue.php中查看。
这样做直接处理事件,因为没有安装实际的队列。
所以在你的情况下,它将不断运行jobmethod,因为它不断迭代相同的函数。如果在jobmethod中删除Queue push,它将返回OK。
为了使这项工作,您必须安装像Beanstalkd这样的排队系统。如果您这样做,请确保在composer.json的require部分添加"pda/pheanstalk": "dev-master"
。
如果您想要运行队列,请查看我对此问题的回答:How to fire Laravel Queues with beanstalkd
答案 1 :(得分:3)
我认为你正在进行无限递归
public function getIndex()
{
$data = array(
'offset' => 3300000,
'site' => 1
);
Queue::push('Class@jobmethod', $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('Class@jobmethod', $data); //This is creating infinite recursion!!!
$job->delete();
}
考虑这个变种:
public function getIndex()
{
$data = array(
'offset' => 3300000,
'site' => 1
);
Queue::push('Class@jobmethod', $data); //Here you push the job to the queue
return 'OK!';
}
public function jobmethod($data)
{
....
//Queue::push('Class@jobmethod', $data); //This is creating infinite recursion!!!
$job->delete();
}