设置队列使用Redis非常容易,在app/config/queue.php
中配置
...
'default' => 'redis',
...
'connections' => array(
...
'redis' => array(
'driver' => 'redis',
'queue' => 'waa',
),
),
即可。
使用时不需要多配置,只要写好Queue类和其fire方法,在需要的位置出队即可。具体方法可以看这里。
class SendEmail {
public function fire($job, $data)
{
//
$job->delete();
}
}
Queue::push('SendEmail@send', array('message' => $message));
Laravel利用artisan命令来执行出队操作,然后进行任务的执行。方法调用如下:
我遇到的问题就在这里,在RedisQueue:pop()
方法中,有这样一句:
$this->redis->zadd($queue.':reserved', $this->getTime() + 60, $job);
这里将当前执行的任务放到另外一个reserved队列中,超时时间是60s。也就是说,如果60s后这个任务没有被删除掉,则任务会重新被放入队列中来。因此,在实际的使用过程中,任务很可能被多次执行。解决的办法是
class SendEmail {
public function fire($job, $data)
{
$job->delete();
// job
}
}
即先删除这个任务,再开始执行任务。
原文地址:Laravel中使用Redis作为队列系统的工作流程, 感谢原作者分享。
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com