执行队列
php artisan queue:work
执行队列过程,从queues:detault:delayed有序集合拿出到期的JOB数据放到queues:detault队列中,然后从首先从queues:detault 队列拿出要执行的JOB数据放入到queues:detault:reserved有序集合中,然后
laravel 这边的延迟队列使用了三个队列。
- queue:default:delayed // 存储延迟任务
- queue:default // 存储 “生” 任务,就是未处理任务
- queue:default:reserved // 存储待处理任务
任务在三个队列中进行轮转,最后一定进入到 queue:default:reserved,并且成功后把任务从这个队列中删除。
其间还使用了 lua 脚本,所以至少 laravel5.3(本文的 laravel 环境)在无 lua 脚本支持的 redis 版本是跑不了的。
它用三个队列把所有的步骤给原子了,所以并没有使用 multi 等操作。也是防止了锁的使用把。每一步操作失败了,都会有后续的步骤继续帮忙完成,记录等行为的。
queue:work
默认只执行一次队列请求,当请求执行完成后就终止;queue:listen
监听队列请求,只要运行着,就能一直接受请求,除非手动终止;queue:work --daemon
同listen
一样,只要运行着,就能一直接受请求,不一样的地方是在这个运行模式下,当新的请求到来的时候,不重新加载整个框架
, 而是直接 fire 动作.
能看出来,queue:work --daemon
是最高级的,一般推荐使用这个来处理队列监听.
WorkCommand.php
Worker.php
Redis作为队列驱动
<?php
namespace Illuminate\Queue;
use Illuminate\Support\Str;
use Illuminate\Queue\Jobs\RedisJob;
use