前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel队列简单使用

Laravel队列简单使用

作者头像
切图仔
发布2022-09-08 19:13:10
7470
发布2022-09-08 19:13:10
举报
文章被收录于专栏:生如夏花绚烂生如夏花绚烂

消息队列的主要特点是异步处理,主要目的是减少请求响应时间和解耦。所以主要的使用场景就是将比较耗时而且不需要即时(同步)返回结果的操作作为消息放入消息队列。同时由于使用了消息队列,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦和。

配置队列

安装扩展包

代码语言:javascript
复制
composer require "predis/predis:~1.0"

队列的配置信息存放在config/queue.php 在.env中修改配置驱动 QUEUE_DRIVER=redis 使用redis驱动 REDIS_CLIENT=predis 使用predis

生成队列需要的数据表

有时候队列会执行失败,这张表用于存放失败信息

代码语言:javascript
复制
php artisan queue:failed-table
php artisan migrate

生成任务类

生成的文件存放在 app\Jobs

代码语言:javascript
复制
php artisan make:jon QueueName

该文件有两个方法 _construct构造方法 注入模型 handler 任务的逻辑

代码语言:javascript
复制
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

use App\Models\Topic;
use App\Handlers\TranslateHandler;

class TranslateSlug implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $topic;

    public function __construct(Topic $topic)
    {
        // 队列任务构造器中接收了 Eloquent 模型,将会只序列化模型的 ID
        $this->topic = $topic;
    }

    public function handle()
    {
        // 请求百度 API 接口进行翻译
        $slug = app(\App\Handlers\TranslateHandler::class)->translate($this->topic->title);

        // 为了避免模型监控器死循环调用,我们使用 DB 类直接对数据库进行操作
        \DB::table('topics')->where('id', $this->topic->id)->update(['slug' => $slug]);
    }
}

注意

若任务涉及到了数据库的读写,需要注意 数据库的读写直接使用 DB 类,而不是使用 ORM 因为一般我们会在模型监听器中分发队列任务,此时,会形成一个死循环 通过 ORM 写数据库,触发 ORM 监听器 -> 分发队列任务 -> 任务中使用了 ORM 写数据库 -> 通过 ORM 写数据库,触发 ORM 监听器 -> ....

分发任务

调用 dispatch(new QueueName($model)) 将任务放在默认的队列上

代码语言:javascript
复制
 public function saved(Topic $topic)
    {
        // 如 slug 字段无内容,即使用翻译器对 title 进行翻译
        if ( ! $topic->slug) {

            // 推送任务到队列
            dispatch(new TranslateSlug($topic));
        }
    }

队列监控

1.通过命令监控

代码语言:javascript
复制
php artisan queue:listen

2.有图形界面的监控 Horizon 安装Horizon

代码语言:javascript
复制
composer require "laravel/horizon:~1.0"

生成配置

代码语言:javascript
复制
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

接下来输入 http://项目名称/horizon即可进入界面

在这里插入图片描述
在这里插入图片描述

输入命令监控队列

代码语言:javascript
复制
php artisan horizon
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档