Laravel中队列使用总结

最近因为项目需求接触了下larave 中的队列 感觉蛮有意思的写个总结

队列其实就是推迟一些耗时的操作 提高web的性能


配置文件

Laravel中关于队列的配置文件在config/queue.php文件中 主要支持的驱动有 同步、数据库、beanstalkd、sqs、redis
下面介绍下我主要使用的数据库驱动模式 后续redis在研究

通过配置文件中可以看到默认使用的是配置文件中的QUEUE_DRIVER变量来定义使用队列驱动的 首先修改.env配置文件中的QUEUE_DRIVER的值为database

生成相关数据表

因为使用的是数据库驱动模式 所以需要一些表 可以使用如下命令

1
2
php artisan queue:table
php artisan migrate

运行后大概内容 其实就是将要生成的表结构 最后会在数据库生成一个 jobs 表 或者你也可以自己新建一个jobs表 表结构如下就好了
queue table

编写任务类

注意队列的任务类都是放在app/Jobs目录下的

你可以使用artisan命令来生成也可以自己手写

1
php artisan make:job YourJobName

比如新建一个 TestJob的任务类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
namespace App\Jobs;
use App\Jobs\Job;
//主要是告诉laravel该任务要推送到队列而不是同步执行
use Illuminate\Contracts\Queue\ShouldQueue;
//避免序列化整个模型实例 下面这2个是trait
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
//注意这里继承的job以及实现的shouldQueue是必须的
class TestJob extends Job implements ShouldQueue{
use InteractsWithQueue, SerializesModels;
protected $age;
/**
* 构造函数 可传参可不传看自己需求
* @param $age
*/
public function __construct($age){
$this->age=$age;
}
/**
* 执行方法 这里也可以使用依赖注入的方式来传递
*/
public function handle(){
echo "this is a test ";
}
}
?>

把任务添加到队列

由于默认的控制器 app/Http/Controllers/Controller中使用了 DispatchesJobs 这个 Trait 这个里面提供了一些操作方法 可以让你把任务添加到队列 dispatch 如果你在 Controller 中需要添加队列 可以直接使用(ps:要继承基础的 controller类) 如果你在别的地方需要添加到对垒 需要引入 use Illuminate\Foundation\Bus\DispatchesJobs;

下面新建一个testcontroller测试下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
//引入要调用的任务类
use App\Jobs\TestJob;
class TestController extends Controller {
public function getShow(){
//因为本controller继承的基础controller里引入了DispatchesJobs 所以可以直接执行推送任务到队列
//改测试job构造函数需要一个参数 随便写了 都是自己定义的
$job=new TestJob(5);
//另外你还可以在单个队列中推送给特定的队列
//$job=(new TestJob(5))->onQueue('two');
//延迟任务执行 这个单位是秒 比如你想延迟5分钟 就 60*5
//$job=(new TestJob(5))->delay(60*5);
//推送任务到队列
$this->dispatch($job);
}
}
?>

如果添加成功的话在数据库中的 jobs 表中会看到记录
queue add

执行队列

可以使用命令

1
2
3
php artisan queue:work
或者
php artisan queue:listen [这个监听好点会有一些详细信息吧]

运行完控制台会有输出 并且数据库的那条对应记录会没有

具体的详细用法可以参考官网的这个地址 Laravel Queue 或者 laravel学院


-------------The End-------------