1

我是第一次在 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!,而是继续加载页面?我将作业设置为登录数据库表,我可以看到它一直运行多次。

有人知道这里发生了什么吗?

4

2 回答 2

9

我猜您将默认队列处理程序设置为“同步”。您可以在 app/config/queue.php 中检查这一点。

这样做是直接处理事件,因为没有安装实际的队列。

因此,在您的情况下,它将不断运行作业方法,因为它不断迭代相同的函数。如果你在jobmethod中去掉Queue push,它会返回OK。

因此,要完成这项工作,您必须安装像 Beanstalkd 这样的排队系统。如果您这样做,请确保您添加"pda/pheanstalk": "dev-master"了 composer.json 的 require 部分。

如果你想运行队列,请查看我对这个问题的回答:How to fire Laravel Queues with beanstalkd

于 2013-07-03T09:51:15.893 回答
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();
    }
于 2014-09-11T15:46:16.143 回答