laravel5.5 queque队列+redis的使用

  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 migrate

  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

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

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

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

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


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

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

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

 

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值