Laravel 4队列的问题

时间:2013-07-03 09:21:26

标签: php frameworks queue laravel jobs

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

有没有人对这里发生的事情有所了解?

2 个答案:

答案 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();
    }