Laravel5.8 队列的使用与监控

队列

Laravel5 使用队列可以异步执行消耗时间的任务,降低请求的响应时间

安装队列驱动

  • 根据你自己的需求安装对应的队列驱动
composer require "predis/predis:~1.1"

关于配置队列

  • 队列配置信息文件 config/queue.php
    其中包含所有支持的队列驱动
    
    .
    .
    'redis' => [
            'driver' => 'redis',// 队列驱动类型
            'connection' => 'default',
            // 默认队列名称 default,若有多个job最好命名互相不一致
            'queue' => env('REDIS_QUEUE', 'default'),
            // 如果retry_after 设定的值为 90, 任务在运行 90 秒后还未完成,那么将被释放回队列而不是删除掉。
            'retry_after' => 90,
            //  redis 节点
            'block_for' => null,
        ],
    .
    .
        # 队列执行失败配置参数
    'failed' => [
        # 队列保存失败 链接数据库默认mysql
        'database' => env('DB_CONNECTION', 'mysql'),
        # 队列保存失败 保存数据库表 failed_jobs 中
        'table' => 'failed_jobs',
    ],
  • .env 中修改所配置的驱动 QUEUE_CONNECTION 的值
QUEUE_CONNECTION=redis
  • 使用队列也会有失败,故需要配置失败任务的表

    php artisan queue:failed-table

生成任务类

  • 创建任务

    • 运行命令行 php artisan make:job QueueJob
    • 将会生成新文件置于 app/Jobs/QueueJob.php
  • 配置任务

    • app/Jobs/QueueJob.php
    • __construct 初始化方法注入对应模型
    请根据自己的模型名称自行替换 Model $model
    此模型名称对应下文的:某模型监听器(app/Observers/某模型监听器文件.php) 的 Model
    
    public function __construct(Model $model)
    {
        // 队列任务构造器中接收了 Eloquent 模型,将会只序列化模型的 ID
        $this->model = $model;
    }
    
    • handler 方法中执行任务所需 code
    public function handle()
    {
        // 执行code...
            
        /*
         * 此处注意点:
         * 
         *  若任务code 涉及到数据库的读写操作,需要将使用 ORM 模型对数据库的读写操作,使用 DB 类代替
         *
         *  若不使用 DB 类对数据库读写,将会陷入调用死循环
         *  因为一般会在 `模型监听器` 中分发队列任务
         *
         *    模型监控器(app/Observers/某模型监听器文件.php)分发任务(app/Jobs/Queue.php) ->
         *      任务(app/Jobs/Queue.php)触发模型监控器(app/Observers/某模型监听器文件.php) ->
         *          模型监控器再次分发任务 -> 
         *              任务再次触发模型监控器 ->...
         */
        
    }
    

分发任务

  • 在模型监听器中调用 dispatch(new QueueJob($model))

    某模型监听器(app/Observers/某模型监听器文件.php) 中

    注意点:
        当创建数据时启用了队列任务的时候,需要在 `saved` 监听方法中分发任务
        
    public function saved(Model $model)
    {
        // 推送任务到队列
        dispatch(new QueueJob($model));
    }    
    
    • 若在saving() 中分发任务,任务运行时通过数据ID 查找数据会出错,此时 saving() 还未将数据写入数据库

关于队列监控

  • 可使用 Laravel 自带的 php artisan queue:listen 监控队列任务

  • 或安装队列监控 Horizon,拥有友好界面监控

  • 安装 Horizon

    composer require "laravel/horizon:~1.0"
  • 发布相关文件
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
  • 访问 Horizon 控制台
http://yourProject.com/horizon
  • Horizon 是监控程序,需要常驻运行
    • artisan horizon 队列工作的守护进程是一个常驻进程.
    • 它不会在你的代码改变时进行重启,
      当修改代码以后,
      需要在命令行中对其进行重启操作。
php artisan horizon
  • artisan horizon 线上部署时需另行配置进程管理工具来监控
    • Supervisor 进程工具可进行管理
上面讲述到 `artisan horizon` 是不会再修改代码后自动重启。
当需要终止当前 `Horizon` 主进程,则需要通过进程工具来重启。

你可能感兴趣的:(Laravel5.8 队列的使用与监控)