laravel异步消息队列详细攻略Supervisor队列进程管理(实战)

1、laravel配置开启队列

这里仅演示数据库队列

查看下面/config/queue.php,里面defult 对应的 env常量是 QUEUE_DRIVER,那就在 项目根目录下的.env文件修改 QUEUE_DRIVER=database


<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Default Queue Connection Name
    |--------------------------------------------------------------------------
    |
    | Laravel's queue API supports an assortment of back-ends via a single
    | API, giving you convenient access to each back-end using the same
    | syntax for every one. Here you may define a default connection.
    |
    */

    'default' => env('QUEUE_DRIVER', 'sync'),

    /*
    |--------------------------------------------------------------------------
    | Queue Connections
    |--------------------------------------------------------------------------
    |
    | Here you may configure the connection information for each server that
    | is used by your application. A default configuration has been added
    | for each back-end shipped with Laravel. You are free to add more.
    |
    | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
    |
    */

    'connections' => [

        'sync' => [
            'driver' => 'sync',
        ],

        'database' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'default',
            'retry_after' => 90,
        ],

        'beanstalkd' => [
            'driver' => 'beanstalkd',
            'host' => 'localhost',
            'queue' => 'default',
            'retry_after' => 90,
        ],

        'sqs' => [
            'driver' => 'sqs',
            'key' => env('SQS_KEY', 'your-public-key'),
            'secret' => env('SQS_SECRET', 'your-secret-key'),
            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
            'queue' => env('SQS_QUEUE', 'your-queue-name'),
            'region' => env('SQS_REGION', 'us-east-1'),
        ],

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => 'default',
            'retry_after' => 90,
            'block_for' => null,
        ],

    ],

    /*
    |--------------------------------------------------------------------------
    | Failed Queue Jobs
    |--------------------------------------------------------------------------
    |
    | These options configure the behavior of failed queue job logging so you
    | can control which database and table are used to store the jobs that
    | have failed. You may change them to any database / table you wish.
    |
    */

    'failed' => [
        'database' => env('DB_CONNECTION', 'mysql'),
        'table' => 'failed_jobs',
    ],

];

.env文件

2、编写队列主文件,新建/app/Job/MessageJob.php


<?php
namespace App\Job;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use App\Service\MessageJobService;
class MessageJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    private $content,$to;//这里可以添加队列需要的参数,以下对应传递到执行程序就好
    public function __construct($content,$to){
        $this->content=$content;
        $this->to=$to;
    }
    public function handle(){
        $res=false;
         try{
             $res=MessageService::send($this->content,$this->to);//这里可以写队列需要执行的逻辑程序
         }catch (\Exception $e){
             Log::error(date('Y-m-d h:i:s',time()).' send message error:'.$e->getMessage());
         }
     
        if($res===true){
            Log::info(date('Y-m-d h:i:s',time()).' send message success:');
        }
    }
}

新建/app/Service/MessageJobService.php封装文件


<?php
namespace App\Service;
use App\Job\MessageJob;
class MessageJobService
{
    public static function add($content,$to){
        $job=new MessageJob($content,$to);
        dispatch($job);
    }
}

3、编写队列逻辑文件,所有业务处理在这里写,新建App\Service\MessageService.php


public static function send($content, $to) {
   
   Log::info('异步队列执行------', ['content' => $content, 'content'=> $content]);
   
}

在需要添加的地方新增队列


public static function sendMessage() {
        //...
        //业务逻辑
        //...
        //添加异步队列
        MessageJobService::add(['content' => '需要传递的数据conent', 'to'=> '需要传递的数据too']);
        return $res;
}

新建队列数据表

# 新建队列主表,下面的 table 是占位符, /config/queue.php 里面的table对应是什么就是什么
php artisan queue:table
# 新建队列失败表
php artisan queue:failed-table

#执行了以上两句后 查看项目根目录下 /app/database/migrations/ 是否存在两个表create记录,然后执行下面添加数据表,你就能看到数据库多了两张表
php artisan migrate

监听队列

  1. 直接监听测试,在项目目录下执行以下命令

php artisan queue:listen

安装supervisor

yum install supervisor

出现以上信息标识已安装成功

1、配置supervisord文件
/etc/supervisord.d/*.ini

示例,在/etc/supervisord.d/下面  新增 laravel-worker.ini:

[program:laravel-worker]                                                        ;进程名称,一般和文件名称一样
process_name=%(program_name)s_%(process_num)02d  ;进程名称,一般和文件名称一样
command= php  /www/laravel/artisan queue:work --queue=queue1 --tries=1   ; 指令,指定队列名为queue2
autostart=true                                                                         ;是否跟随supervisord的启动而启动
autorestart=true        ;程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启stopasgroup=true;进程被杀死时,是否向这个进程组发送stop信号,包括子进程
user=www                                                                                ;执行进程的用户
startsecs = 1                                                                           ;自动重启时间间隔(s)
numprocs=1                                   ;进程数                                                                                
redirect_stderr=true                                                ;是否开启是否重定向错误日志至输出日志
stdout_logfile=/etc/supervisord.d/logs/laravelrabbit.log        ;日志路径

2、相关命令

#校验配置文件是否有修改
  supervisorctl reread
  
  #更新配置
  supervisorctl update
  
  #查看supervisor状态
  supervisorctl status
  
  #修改了job里面的东西后需要在项目下执行
  php artisan queue:restart
  
  # 开机自启动
  systemctl enable supervisord
  # 启动supervisord服务
  systemctl start supervisord  
  # 查看supervisord服务状态
  systemctl status supervisord  
  # 查看是否存在supervisord进程
  ps -ef | grep supervisord        
  
  #给执行权限
  chmod -R +x /etc/supervisor/supervisord.conf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/323183.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

64位ATT汇编语言学习第一课:汇编和链接

源文件exitTest.s内容如下&#xff1a; # This is the first program .global _start .section .text _start:movq $60,%raxmovq $9,%rdisyscall源文件里边放的就是源代码&#xff0c;而我这里源代码是使用汇编语言写的&#xff0c;都是一些人类都可以阅读的字符。之后需要经过…

c语言do while循环语句

c语言do while循环语句 c语言do while循环语句 c语言do while循环语句一、do while循环语句格式二、do while 循环案例 一、do while循环语句格式 do while语句先循环后判断,条件不符合就结束循环&#xff0c;条件符合继续循环 do { 代码 } while(表达式);int main() {int a 0…

【STM32】STM32学习笔记-MPU6050简介(32)

00. 目录 文章目录 00. 目录01. MPU6050简介02. MPU6050参数03. MPU6050硬件电路04. MPU6050框图05. MPU6050常用寄存器06. 附录 01. MPU6050简介 •MPU6050是一个6轴姿态传感器&#xff0c;可以测量芯片自身X、Y、Z轴的加速度、角速度参数&#xff0c;通过数据融合&#xff0…

LLM推理部署(七):FireAttention——通过无损量化比vLLM快4倍

Mixtral作为第一个在数万亿tokens上训练的OSS模型&#xff0c;最近在人工智能社区掀起了波澜&#xff0c;它支持“混合专家”&#xff08;MoE&#xff09;&#xff0c;并且训练和推理速度非常快。 Fireworks AI是第一个托管Mixtral的平台&#xff0c;在Mixtral公开发布之前就托…

第15届蓝桥杯嵌入式省赛准备第一天总结笔记(使用STM32cubeMX创建hal库工程+点亮LED)

一.使用STM32cubeMX创建工程 1.安装芯片包 点击红圈 找到STM32G4安装最新版本 2.创建工程 点击红圈 在搜索框里搜索STM32G431RBT6&#xff0c;然后点击Start。 然后点击System Core选择RCC&#xff0c;这里是设置外部晶振引脚。 然后配置外部高速时钟为80MHz 然后我们查看电…

基于开源组件自主开发工作流引擎系统

目前基于Java语言开发的主流开源工作流引擎有osworkflow、jbpm、activiti、flowable、camunda。其中osworkflow、jbpm技术较老已经过时&#xff0c;activiti包括activiti5、activiti6、activiti7三个版本&#xff0c;flowable分开源版和商业版&#xff0c;camunda包括camunda7和…

强化学习AI构建实战 - 基于“黄金点”游戏(二)

服务端接口 为了让大家的AI可以顺利地进行游戏&#xff0c;并验证我们对策略和AI的一些实现&#xff0c;我们需要一些基础设施来帮助我们完成一些工作。这些工作包括游戏回合的控制、参与者之间的数据同步、游戏数据的储存等功能。 为了简化这些基础工作&#xff0c;以便大家…

旧路由重置新路由设置新路由设置教程|适用于PPPoE拨号

前言 前几天朋友说路由器想要重置&#xff0c;但不知道怎么弄。所以就想着只帮忙重置路由器的话&#xff0c;只能帮到一个人。但把整个过程写成图文&#xff0c;就可以帮助更多人。 本文章适合电脑小白&#xff0c;请注意每一步哦&#xff01; 注意事项 开始之前需要确认光猫…

TAX个税小知识

人&#xff1a;个人&#xff0c;非居民个人 种类&#xff1a;工资薪金&#xff0c;劳务报酬所得&#xff0c;特许使用费&#xff0c;稿酬所得 工资按月支付扣税&#xff0c;不用个人提供发票&#xff0c;有签劳动合同&#xff1b; 其他三项按月或按次扣税&#xff0c;需要开发…

TTL篇-TtlAgent的使用

接上篇&#xff0c;TTL篇-TTL的使用-CSDN博客 TtlAgent是什么 ttl使用的典型代码是如下所示&#xff0c; DataAllArgsConstructorpublic static class Bean {private String name;}Testpublic void testBean() throws InterruptedException {TransmittableThreadLocal<Be…

10、Kafka ------ 消费者组 和 消费者实例,分区 和 消费者实例 之间的分配策略

目录 消费者组 和 消费者实例★ 消费者组★ 分区 和 消费者实例★ 分配分区&#xff08;分区 和 消费者实例 之间的分配策略&#xff09;3种分配策略★ range策略★ round-robin策略 &#xff08;轮询&#xff09;★ stick策略 如何指定分配分区的策略&#xff1a; 消费者组 和…

Git 基本使用

Git Git是一种分布式版本控制系统&#xff0c;它可以帮助开发团队更好地管理代码并进行协同开发。 gitee,github,gitlab&#xff0c;是基于git的代码托管平台。 官方文档地址(中文)&#xff1a;Git - Git 是什么&#xff1f; 安装和配置 官网下载地址&#xff1a;Git - Downl…

面试官心声:个个都说会自动化,结果面试一问细节全露馅了

今年我们部门计划招聘几名自动化测试工程师&#xff0c;为此我进行了面试和培训&#xff0c;发现了一个让我感到担忧的趋势&#xff0c;许多候选人可以轻松地回答有关脚本编写、元素定位、框架API等问题。然而一问到实际项目&#xff0c;比如 “如何从0开始搭建自动化体系”、“…

k8s---pod控制器

pod控制器发的概念&#xff1a; 工作负载&#xff0c;workload用于管理pod的中间层&#xff0c;确保pod资源符合预期的状态。 预期状态&#xff1a; 1、副本数 2、容器重启策略 3、镜像拉取策略 pod出故障的出去等等 pod控制器的类型&#xff1a; 1、replicaset&#xf…

from表单通过遍历的方式显示

当我们绘制表单数据的时候&#xff0c;有时候知道需要绘制的内容&#xff0c;但是不想在页面一条一条写数据&#xff0c;如果通过遍历显示呢 下面是在uniapp中写h5的方法&#xff0c;直接上代码 <view><view classitem v-for(item,index) in arr :keyindex><v…

【学习资源】分享三个文献互助平台(科研通 / 谷粉 / 纬度)

最近博主准备阅读一些专业相关的文献&#xff0c;有一些可以从博主所在单位购买的数据中直接下载&#xff0c;然而有一些论文数据库是没有购买的&#xff0c;所以要博主自己想办法去下载。 一般来说&#xff0c;两年以前的SCI论文&#xff0c;基本上都可以借助Scihub下载的到&…

pc端微信QQ使用代理解决方案

背景 多数金融类公司都会限制QQ和微信访问&#xff0c;但某些情况导致不得不使用&#xff0c;时不时使用手机会让你的老板感觉你在摸鱼&#xff0c;所以站在技术的角度上研究一下如果在pc端使用 代理开启 以微信举例&#xff0c;如果你用的clash&#xff0c;这里的地址可以设…

2024 解决matplotlib中文字体问题

第一种代码&#xff08;失败代码&#xff09; import matplotlib as mpl import matplotlib.pyplot as plt from matplotlib.font_manager import FontPropertiesfont_path /Users/huangbaixi/Desktop/SimHei.ttfdef plot_demo():#print(mpl.get_cachedir())# 绘制折线图font…

人脸考勤技术,这个隐藏功能太好用了!

随着科技的不断发展&#xff0c;人脸识别技术在各个领域得到了广泛的应用。其中&#xff0c;三维人脸考勤系统作为一种高级的人脸识别技术&#xff0c;不仅提高了考勤系统的准确性&#xff0c;还增强了安全性。 客户案例 制造企业 山东某大型制造企业引入了泛地缘科技推出的三…