使用队列有利于模块与模块,系统与系统之间的解耦,对构建高内聚,松耦合的系统很重要, laravel 队列基本工作方式:dispatch 一个 job 的时候,laravel 把 job 序列化保存到相应的 driver 中(redis、database、file...),然后 queue:listen 或 queue:work 的时候会从对应的 driver 里面取出这个 job,对 payload 反序列化,然后调用 job 里面的 handle 方法进行 job 的处理。
以下是如果在laravel使用队列的简单实例
1、修改.evn
设置queue为redis驱动
queue驱动主要有sync,redis,database,mq ,中小型系统建议使用redis, 复杂系统使用mq
初始默认为sync 这个分派任务的时候直接同步执行,修改为redis则使用redis 的list(尽快执行的队列)和zset(延时执行的队列)两种数据类型保存,也可以用数据库为驱动
QUEUE_CONNECTION=redis
并配置好你的redis,以下是我本机的配置
REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 REDIS_DATABASE=0
2、创建任务,例子创建一个 aSampleQueue
php artisan make:job aSampleQueue
3、修改aSampleQueue.php
class aSampleQueue implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; private $message;
public function __construct($message)
{
$this->message = $message;
//
}
//handle 方法是队列需要执行的业务,这里用一个写一条日志作为业务内容 public function handle() { \Log::info($this->message); // } }
4、分发内容给队列,本例子假定在路由上调用
Route::get('/test/queue/{name}', function ($name){ App\Jobs\aSampleQueue::dispatch("创建用户:{$name}".date('H:i:s'));//立即执行的队列 });
假定域名为la.com,在浏览器输入:http://la.com/test/queue/lucas ,到redis查看,如下图
也可以制定队列名onQueue('delayQueueSample')和指定执行时间addMinutes(30)
Route::get('/test/queue/{name}', function ($name){ App\Jobs\aSampleQueue::dispatch("创建用户:{$name}".date('H:i:s'))->onQueue('delayQueueSample')->delay(\Illuminate\Support\Carbon::now()->addMinutes(30));//延迟30分钟执行 });
在redis查到该队列,说明写入成功
4、用命令行执行队列
php artisan queue:work
这是一个常驻进程,需要停止可以按ctrl+c
5、如果使用数据库来保存队列,执行
php artisan queue:table
php artisan migrate
并在.evn 修改
QUEUE_CONNECTION=database
完成。
参考:
1、https://blog.csdn.net/raoxiaoya/article/details/104241467 Laravel延迟队列的实现原理
2、https://www.cnblogs.com/eleven24/p/9348932.html 使用 Laravel 的 queue 必须知道的一些事