PHP+Laravel框架RabbitMQ简单使用

news2024/11/27 18:33:24

RabbitMQ安装教程请转到:RabbitMQ安装教程(超详细)

1、创建生产者

在app/Http/Controllers里创建一个php控制器文件,

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
//引入amqp扩展
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Wire\AMQPTable;


require_once(__DIR__.'/../../../../vendor/autoload.php');

class TestController extends Controller {
    
    public function production() {
        //创建服务器连接
        $connection = new AMQPStreamConnection('172.16.5.114', 5672, 'admin', '123456');
        //连接信道
        //信道是生产消费者与rabbit通信的渠道,生产者publish或者消费者消费一个队列都是需要通过信道来通信的
        //信道是建立在TCP上面的虚拟链接,也就是rabbitMQ在一个TCP上面建立成百上千的信道来达到多个线程处理。
        //注意是一个TCP 被多个线程共享,每个线程对应一个信道,信道在rabbit都有唯一的ID,保证了信道的私有性,对应上唯一的线程使用。
        $channel = $connection->channel();

        //channel->queue_declare通过信道创建一个是否是持久化的消息队列
        //queue第一个参数代表消息队列名称
        $channel->queue_declare('test_queue', false, false, false, false);

        //往队列里要发送内容,待发送的内容
        $data = '这是一个生产者消息' . date('Y-m-d H:i:s');
        $msg = new AMQPMessage($data);
        //通过信道来进行发送消息
        //而exchange是怎么知道消息应该推到哪个queue呢,这就要通过绑定queue与exchange时的routingkey了,通过代码进行绑定并且指定routingkey,下面有一张关系图,p(发布者) —> x(exchange) bindding(绑定关系也就是我们的routingkey) 红色代表着queue
        $channel->basic_publish($msg, '', 'test_queue');

        echo " [x] Sent '这是一个生产者消息!'\n";

        //关闭信道
        $channel->close();
        //关闭连接
        $connection->close();
    }
}

在routes/web.php中加一下路由

use App\Http\Controllers\TestController;

Route::get('/test/production', [TestController::class, 'production']);

运行下就可以生成队列了

 2、创建消费者

在app/Console/Commands下创建一个php文件,比如TestQueue.php

<?php

namespace App\Console\Commands\Queue;

use Illuminate\Console\Command;
use PhpAmqpLib\Connection\AMQPStreamConnection;

class TestQueue extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'rabbitmq_TestQueue';//给消费者起个command名称

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        //创建服务器连接
        $connection = new AMQPStreamConnection('172.16.5.114', 5672, 'admin', '123456');
        //连接信道
        //信道是生产消费者与rabbit通信的渠道,生产者publish或者消费者消费一个队列都是需要通过信道来通信的
        //信道是建立在TCP上面的虚拟链接,也就是rabbitMQ在一个TCP上面建立成百上千的信道来达到多个线程处理。
        //注意是一个TCP 被多个线程共享,每个线程对应一个信道,信道在rabbit都有唯一的ID,保证了信道的私有性,对应上唯一的线程使用。
        $channel = $connection->channel();

        //channel->queue_declare通过信道创建一个是否是持久化的消息队列
        //queue第一个参数代表消息队列名称
        $channel->queue_declare('test_queue', false, false, false, false);

        echo " [*] Waiting for messages. To exit press CTRL+C\n";

        //进行监听消费者是否有消息,如果有进行输出消息内容
        $callback = function ($msg) {
            echo ' [x] Received ', $msg->body, "\n";
        };

        //通过信道进行消费消息
        $channel->basic_consume('test_queue', '', false, true, false, false, $callback);

        //如果信道是打开状态
        while ($channel->is_open()) {
            //然后让信道一直处于监听等待状态
            $channel->wait();
        }

        //关闭信道
        $channel->close();
        //关闭连接
        $connection->close();
    }
}

修改app/Console/Kernel.php文件,即$commands增加TestQueue::class

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use App\Console\Commands\Queue\TestQueue;
use App\Console\Commands\Queue\Other;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        TestQueue::class,
        Other::class
    ];

    /**
     * Define the application's command schedule.
     *
     * @param \Illuminate\Console\Scheduling\Schedule $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')
        //          ->hourly();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

3、使用command进行测试

先cd到项目根目录,执行下面命令

php artisan rabbitmq_TestQueue

就消费了消息

 按 Ctrl+c 结束

生产环境可以使用守护进程

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

铁路轨道交通智慧管理系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

sklearn基础篇(九)-- 主成分分析(PCA)

1 引言 降维是对数据高维度特征的一种预处理方法。降维是将高维度的数据保留下最重要的一些特征&#xff0c;去除噪声和不重要的特征&#xff0c;从而实现提升数据处理速度的目的。在实际的生产和应用中&#xff0c;降维在一定的信息损失范围内&#xff0c;可以为我们节省大量的…

机器学习项目中Xgboost深入理解(二)梯度及GB的理解

Xgboost 与 GBDT同源&#xff0c;那么所谓的梯度是什么意思呢&#xff1f;G、B又代表什么。 1. 梯度Gradient 梯度是一个向量&#xff08;矢量&#xff09;&#xff0c;表示梯度是方向导数在某一点的最大值。理解为某函数&#xff08;可以指损失函数&#xff09;在某点处的方…

Fluent后处理的色谱设置

PART 1 概述 对物理场的空间分布进行可视化展示&#xff0c;在科研、工程等领域是必不可少的环节。 将物理量不同数值赋予不同色彩&#xff0c;是一种很常见的物理场可视化方法。通过色彩的变化&#xff0c;即可识别物理量的分布规律。 物理量数值和颜色之间的对应关系称为色…

Linux常用指令

目录 1.1关于目录操作的指令 1.2文件操作的指令 1.3创建/删除目录操作 1.4目录/文件的移动/复制/改名 1.5 vim对文件进行编辑 1.1关于目录操作的指令 ls 列出当前目录下都有啥 ls 具体路径或 /注意中间含有一个空格&#xff0c;列出跟目录下或指定路径的内容 ls -l / 以列表的…

mysql日志篇

mysql日志篇1、Undo-log 撤销日志 Undo即撤销的意思&#xff0c;大家通常也习惯称它为回滚日志。如果大家有仔细研究过 MySQL 的日志&#xff0c;应该会发现 Undo-log 并不存在单独的日志文件&#xff0c;也就是磁盘中并不会存在 xx-undo.log 这类的文件&#xff0c;那 Undo-lo…

12个python超强学习网站

一、python学习网站 1 CSDN 地址&#xff1a; CSDN学院 特点&#xff1a;从免费视频到入门项目&#xff0c;从入门到进阶&#xff0c;学习视频应有尽有&#xff0c;还有Python学习社区&#xff0c;良好的学习和沟通氛围&#xff01; 2 Python123 地址&#xff1a;python123…

ReentrantLock源码分析

ReentrantLock源码分析 源码思想加锁&#xff1a; (1)使用构造方法设置该锁为公平锁FairSync或非公平锁NonfairSync;(本处选定非公平锁) (2)调用lock方法进行获取锁,第一次(getState() 0)在NonfairSync中使用CAS(compareAndSwapInt)直接获取(此处默认未获取成功),第一次获取失…

docker--快速启动功能性Hadoop集群进行功能验证

工作时&#xff0c;有时需要快速启动功能性Hadoop集群来测试一些hadoop相关的项目及功能。 本文讲解如何基于docker&#xff0c;快速搭建一个功能性Hadoop集群&#xff0c;来测试验证一些功能。 使用的docker镜像 使用的docker镜像的源码地址是&#xff1a;hadoop-hive-3.1.x…

挑战杯刷题

字符串相关 字符串相关&#xff1a; 插入元素&#xff1a; str.insert(pos,num,string);//pos是待查入的位置&#xff0c;num是插入几次&#xff0c;string是待插入的字符串 str.insert(pos,string);//与上面insert一样&#xff0c;不过只在pos位置插入string一次查找指定字符串…

[附源码]Node.js计算机毕业设计高校宿舍管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Mac M1配置SSH Key并添加

配置SSH Key 设置github账户信息 添加github的名字和绑定的邮箱 git config --global user.name “your_name” git config --global user.email “your_emailexample.com” 查看一下 git config --global --list 如果添加成功就会显示刚才的名称和邮箱 创建 创建SSH Key s…

关于切换场景加载耗时的优化问题

1&#xff09;关于切换场景加载耗时的优化问题 ​2&#xff09;SpriteAtlas打包AssetBundle后运行时内存大小和什么有关系 3&#xff09;手机上使用MRT的限制和兼容性 4&#xff09;如何控制粒子系统组件数量的上限 这是第317篇UWA技术知识分享的推送。今天我们继续为大家精选了…

大数据-玩转数据-深入浅出K8S

一、K8S和Docker的比较 Docker 是一个开源的、轻量级的容器引擎&#xff0c;和 VMware 虚拟机相比&#xff0c;Docker 使用容器承载应用程序&#xff0c;而不使用操作系统&#xff0c;所以它的开销很少&#xff0c;性能很高。但是&#xff0c;Docker 对应用程序的隔离不如虚拟…

SO_REUSEPORT socket选项介绍以及在nginx上的配置

SO_REUSEPORT (reuseport) 是网络的一个选项设置&#xff1a; 它能开启内核功能&#xff1a;网络链接分配 内核负载均衡&#xff0c;该功能允许多个进程/线程 bind/listen 相同的 IP/PORT&#xff0c;提升了新链接的分配性能。reuseport 也是内核解决 惊群问题 的优秀方案&…

CoSENT:比sentence bert更好的向量表征

本文是对https://spaces.ac.cn/archives/8847文章的总结 有监督的文本表征主流方案是sentence bert&#xff0c;虽然sentence BERT效果还行&#xff0c;但是存在训练和预测不一致的问题&#xff0c;而一些文章也指出而如果直接优化预测目标cos值&#xff0c;效果往往特别差&…

方寸间联结世界,中国直播电商如何诠释“人类命运共同体”?

十几个人凝神屏息地盯着屏幕&#xff0c;仿佛静止了一般&#xff0c;眼睛一眨不眨&#xff0c;生怕错过了什么。直到听到屏幕另一端终于有了动静&#xff0c;悬在他们心里的石头才落下——“谢谢大家的支持&#xff0c;全部没有了。” 话音未落&#xff0c;这边已爆发了欢呼声…

只工作,不上班,「远程办公」是不是理想的工作方式?

在我们90后眼中&#xff0c;上班和工作是两回事。准确来说。上班是为别人做事&#xff0c;而工作是为自己。 圆桌派有一期的话题是“不想工作怎么破&#xff1f;”当时&#xff0c;几位嘉宾说&#xff1a;“不是不想工作&#xff0c;是不想上班”&#xff0c;“周围很多年轻人…

【linux】之 kubernetes安装

一、容器编排工具 docker machinedocker composedocker swarm docker servicedocker stack kubernetesmesosmarathon 二、PaaS平台 OpenShiftRancher 三、认识kubernetes 官方网址 https://kubernetes.io/ https://kubernetes.io/zh/ 中文社区 http://docs.kubernetes.org…

libco 宏分析

// 下面是从libco中导出的宏 #include <iostream> using namespace std;/*以下是计算参数的个数&#xff0c;最多支持7个参数 */ #define comac_get_args_cnt( ... ) comac_arg_n( __VA_ARGS__ ) #define comac_arg_n( _0,_1,_2,_3,_4,_5,_6,_7,N,...) N #define comac_a…