欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

laravel5.5 queque队列+redis的使用

程序员文章站 2022-05-19 15:50:20
...
  1. 首先安装predis扩展 :composer require predis/predis
  2. 队列的配置信息储存于 config/queue.php 文件中,在这个文件中你会发现框架所支持的队列驱动的配置连接示例。这些驱动包括:数据库,Beanstalkd,Amazon SQS,Redis,和一个同步(本地使用)的驱动。还有一个名为 null 的驱动表明不使用队列任务。
  3. 咱们这里所用的是 redis 驱动,所以一下只是对于redis驱动来示范的。
  4. 接下来我们还需要修改环境变量 QUEUE_DRIVER 的值为 redis: 修改 .env 文件
    QUEUE_DRIVER=redis
  5. 为了使用 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,
        ],
    ],
    这里我没做任何修改,还是用框架默认的配置格式。
  6. 生成一个任务类:php artisan make:job CreateAdminUsers

    在你的应用程序中,队列的任务类都默认放在 app/Jobs 目录下。如果这个目录不存在,那当你运行 make:job Artisan 命令时目录就会被自动创建。

  7. 生成的类实现了 Illuminate\Contracts\Queue\ShouldQueue 接口,这意味着这个任务将会被推送到队列中,而不是同步执行。

  8.  

    任务类的结构如下所示:这个任务类,我只是写了一个向数据表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);
        }
    }

     

  9. 有时候队列中的任务会失败。Laravel 内置了一个方便的方式来指定任务重试的最大次数。当任务超出这个重试次数后,它就会被插入到 failed_jobs 数据表里面。

  10. 我们可以使用 queue:failed-table 命令来创建 failed_jobs 表的迁移文件,执行:php artisan queue:failed-table  会新建 database/migrations/{timestamp}_create_failed_jobs_table.php 文件

  11. 接着使用 migrate Artisan 命令生成 failed_jobs 表,执行:php artisan migratelaravel5.5 queque队列+redis的使用

  12. 开始任务分发,我是在控制器中,写了一个简单的测试方法,如下:

    public function index(Request $request){
    
            $params    = [
                'username' => '王五',
                'phone'    => '1344444444',
                'password' => '$2y$10$yoOslZ7mlMUmv1SCZhh/rubAgH5.4qxpHSt78eTQ3G5L3J4uDDOhW',
            ];
            dispatch(new CreateAdminUsers($params))->delay(Carbon::now()->addMinutes(1));
    }

     

  13. 开始测试,开始之前,我们需要在命令行启动队列系统,队列在启动完成后会进入监听状态:php artisan queue:listen

laravel5.5 queque队列+redis的使用

   14.数据表admin_users表已有的数据如下:

laravel5.5 queque队列+redis的使用

15.通过路由咱们访问一下控制器,让队列开始执行。执行后的数据表就会多一条数据。

laravel5.5 queque队列+redis的使用

补充:在任务类里面,加上如下代码:当遇到错误时,表 failed_jobs中,就回记录一条数据。

/**
 * 任务最大尝试次数。
 *
 * @var int
 */
public $tries = 5;


/**
 * 任务运行的超时时间。
 *
 * @var int
 */
public $timeout = 120;

下图可以清楚的看到,任务类在执行5次以后,就不在执行了。同时数据表 fileds_jobs中也会新增一条记录,记录的是任务类执行错误的原因。

laravel5.5 queque队列+redis的使用

 fileds_jobs记录的错误原因如下所示:

laravel5.5 queque队列+redis的使用 

如有不明白之处,请参考官方文档:队列