laravel5.5 queque队列+redis的使用
- 首先安装predis扩展 :composer require predis/predis
- 队列的配置信息储存于
config/queue.php
文件中,在这个文件中你会发现框架所支持的队列驱动的配置连接示例。这些驱动包括:数据库,Beanstalkd,Amazon SQS,Redis,和一个同步(本地使用)的驱动。还有一个名为null
的驱动表明不使用队列任务。 - 咱们这里所用的是 redis 驱动,所以一下只是对于redis驱动来示范的。
- 接下来我们还需要修改环境变量
QUEUE_DRIVER
的值为redis
: 修改 .env 文件
QUEUE_DRIVER=redis - 为了使用
redis
队列驱动,你需要在你的配置文件config/database.php
中配置 Redis 的数据库连接。如果你的 Redis 队列连接使用的是 Redis 集群,你的队列名称必须包含 key hash tag。这是为了确保所有的 Redis 键对于一个给定的队列都置于同一哈希中:'redis' => [ 'client' => 'predis', 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, ], ], 这里我没做任何修改,还是用框架默认的配置格式。
-
生成一个任务类:php artisan make:job CreateAdminUsers
在你的应用程序中,队列的任务类都默认放在 app/Jobs 目录下。如果这个目录不存在,那当你运行 make:job Artisan 命令时目录就会被自动创建。
-
生成的类实现了
Illuminate\Contracts\Queue\ShouldQueue
接口,这意味着这个任务将会被推送到队列中,而不是同步执行。 -
任务类的结构如下所示:这个任务类,我只是写了一个向数据表admin_users添加数据的方法。咱们主要是了解队列的使用,handle方法里面的逻辑,根据自己的所需。自行开发即可。
<?php namespace App\Jobs; use App\Entities\AdminUsers; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; class CreateAdminUsers implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; private $params = []; /** * Create a new job instance. * * @return void */ public function __construct($params) { $this->params = $params; } /** * Execute the job. * * @return void */ public function handle() { $result = AdminUsers::create([ 'username' => $this->params['username'], 'phone' => $this->params['phone'], 'password' => $this->params['password'], ]); var_dump($result); } }
-
有时候队列中的任务会失败。Laravel 内置了一个方便的方式来指定任务重试的最大次数。当任务超出这个重试次数后,它就会被插入到
failed_jobs
数据表里面。 -
我们可以使用
queue:failed-table
命令来创建failed_jobs
表的迁移文件,执行:php artisan queue:failed-table 会新建database/migrations/{timestamp}_create_failed_jobs_table.php
文件 -
接着使用
migrate
Artisan 命令生成failed_jobs
表,执行:php artisan migrate -
开始任务分发,我是在控制器中,写了一个简单的测试方法,如下:
public function index(Request $request){ $params = [ 'username' => '王五', 'phone' => '1344444444', 'password' => '$2y$10$yoOslZ7mlMUmv1SCZhh/rubAgH5.4qxpHSt78eTQ3G5L3J4uDDOhW', ]; dispatch(new CreateAdminUsers($params))->delay(Carbon::now()->addMinutes(1)); }
-
开始测试,开始之前,我们需要在命令行启动队列系统,队列在启动完成后会进入监听状态:php artisan queue:listen
14.数据表admin_users表已有的数据如下:
15.通过路由咱们访问一下控制器,让队列开始执行。执行后的数据表就会多一条数据。
补充:在任务类里面,加上如下代码:当遇到错误时,表 failed_jobs中,就回记录一条数据。
/** * 任务最大尝试次数。 * * @var int */ public $tries = 5; /** * 任务运行的超时时间。 * * @var int */ public $timeout = 120;
下图可以清楚的看到,任务类在执行5次以后,就不在执行了。同时数据表 fileds_jobs中也会新增一条记录,记录的是任务类执行错误的原因。
fileds_jobs记录的错误原因如下所示:
如有不明白之处,请参考官方文档:队列
推荐阅读