如何使用laravel queue 队列的简单例子

使用队列有利于模块与模块,系统与系统之间的解耦,对构建高内聚,松耦合的系统很重要, 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 --queue=delayQueueSample

 

 

 这是一个常驻进程,需要停止可以按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 必须知道的一些事

 

 

  

  

 

posted @ 2021-08-10 19:55  i金少  阅读(913)  评论(0编辑  收藏  举报