问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

PHP+Laravel框架RabbitMQ简单使用(PTP)

发布网友 发布时间:2024-10-01 20:32

我来回答

1个回答

热心网友 时间:2024-10-17 18:30

一、简介

Point-to-Point,点对点通信模型。PTP是基于队列(Queue)的,一个队列可以有多个生产者,和多个消费者。消息服务器按照收到消息的先后顺序,将消息放到队列中。队列中的每一条消息,只能由一个消费者进行消费,消费之后就会从队列中移除。

特点:

每个消息只用一个消费者;

发送者和接受者没有时间依赖;

接受者确认消息接受和处理成功。

P 表示为生产者 、C 表示为消费者,红色表示队列。

在RabbitMQ中有生产者,消费者的概念,本篇主要是消息如何生产以及消费者这部分的实现。使用的laravel框架,php-amqplib拓展。

二、Laravel中添加依赖

在项目根目录下执行一下命令

composer require php-amqplib/php-amqplib

lishuo@李硕的MacBook?Pro:~/Code/php/www.zfw.com?(branch:?master!)$?composer?require?php-amqplib/php-amqplibUsing?version?^3.1?for?php-amqplib/php-amqplib./composer.json?has?been?updatedRunning?composer?update?php-amqplib/php-amqplibLoading?composer?repositories?with?package?informationUpdating?dependenciesNothing?to?modify?in?lock?fileInstalling?dependencies?from?lock?file?(including?require-dev)Nothing?to?install,?update?or?removePackage?caouecs/laravel-lang?is?abandoned,?you?should?avoid?using?it.?Use?https://github.com/Laravel-Lang/lang?instead.Package?swiftmailer/swiftmailer?is?abandoned,?you?should?avoid?using?it.?Use?symfony/mailer?instead.Generating?optimized?autoload?files>?Illuminate\Foundation\ComposerScripts::postAutoloadDump>?@php?artisan?package:discover?--ansiDiscovered?Package:?barryvdh/laravel-ide-helperDiscovered?Package:?facade/ignitionDiscovered?Package:?fruitcake/laravel-corsDiscovered?Package:?jenssegers/mongodbDiscovered?Package:?laravel/passportDiscovered?Package:?laravel/sailDiscovered?Package:?laravel/sanctumDiscovered?Package:?laravel/tinkerDiscovered?Package:?maatwebsite/excelDiscovered?Package:?nesbot/carbonDiscovered?Package:?nunomaduro/collisionPackage?manifest?generated?successfully.100?packages?you?are?using?are?looking?for?funding.Use?the?`composer?fund`?command?to?find?out?more!>?@php?artisan?vendor:publish?--tag=laravel-assets?--ansiNo?publishable?resources?for?tag?[laravel-assets].Publishing?complete.三、使用Laravel的command来实现消息的生产和消费1.创建生产者

执行以下命令快速创建生产者

php artisan make:command RabbitmqProducerCommand

lishuo@李硕的MacBook?Pro:~/Code/php/www.zfw.com?(branch:?master!)$?php?artisan?make:command?RabbitmqProducerCommandConsole?command?created?successfully.基本代码(接下来就在command里面写生产消息的逻辑)<?phpnamespace?App\Console\Commands;use?Illuminate\Console\Command;//引入amqp扩展use?PhpAmqpLib\Connection\AMQPStreamConnection;use?PhpAmqpLib\Message\AMQPMessage;class?RabbitmqProducerCommand?extends?Command{????/**?????*?The?name?and?signature?of?the?console?command.?????*?????*?@var?string?????*/????protected?$signature?=?'rabbitmq_producer';//给生产者起个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('localhost',?5672,?'guest',?'guest');????????//连接信道????????//信道是生产消费者与rabbit通信的渠道,生产者publish或者消费者消费一个队列都是需要通过信道来通信的????????//信道是建立在TCP上面的虚拟链接,也就是rabbitMQ在一个TCP上面建立成百上千的信道来达到多个线程处理。????????//注意是一个TCP?被多个线程共享,每个线程对应一个信道,信道在rabbit都有唯一的ID,保证了信道的私有性,对应上唯一的线程使用。????????$channel?=?$connection->channel();????????//channel->queue_declare通过信道创建一个是否是持久化的消息队列????????//queue第一个参数代表消息队列名称????????$channel->queue_declare('test',?false,?false,?false,?false);????????//往队列里要发送内容,待发送的内容????????$msg?=?new?AMQPMessage('我是一个生产者消息');????????//通过信道来进行发送消息????????//而exchange是怎么知道消息应该推到哪个queue呢,这就要通过绑定queue与exchange时的routingkey了,通过代码进行绑定并且指定routingkey,下面有一张关系图,p(发布者)?—>?x(exchange)?bindding(绑定关系也就是我们的routingkey)?红色代表着queue????????$channel->basic_publish($msg,?'',?'test');????????echo?"?[x]?Sent?'我是一个生产者消息!'\n";????????//关闭信道????????$channel->close();????????//关闭连接????????$connection->close();????}}2.创建消费者

因为消费者是需要常驻内存的,所以需要在cli下运行,我们可以通过以下操作创建一个任务。

?php?artisan?make:command?RabbitmqConsumerCommand基本代码(接下来就在command里面写消费消息的逻辑)<?phpnamespace?App\Console\Commands;use?Illuminate\Console\Command;use?PhpAmqpLib\Connection\AMQPStreamConnection;class?RabbitmqConsumerCommand?extends?Command{????/**?????*?The?name?and?signature?of?the?console?command.?????*?????*?@var?string?????*/????protected?$signature?=?'rabbitmq_consumer';//给消费者起个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('localhost',?5672,?'guest',?'guest');????????//连接信道????????//信道是生产消费者与rabbit通信的渠道,生产者publish或者消费者消费一个队列都是需要通过信道来通信的????????//信道是建立在TCP上面的虚拟链接,也就是rabbitMQ在一个TCP上面建立成百上千的信道来达到多个线程处理。????????//注意是一个TCP?被多个线程共享,每个线程对应一个信道,信道在rabbit都有唯一的ID,保证了信道的私有性,对应上唯一的线程使用。????????$channel?=?$connection->channel();????????//channel->queue_declare通过信道创建一个是否是持久化的消息队列????????//queue第一个参数代表消息队列名称????????$channel->queue_declare('test',?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',?'',?false,?true,?false,?false,?$callback);????????//如果信道是打开状态????????while?($channel->is_open())?{????????????//然后让信道一直处于监听等待状态????????????$channel->wait();????????}????????//关闭信道????????$channel->close();????????//关闭连接????????$connection->close();????}}三、使用command进行测试生产消息和消费消息是否成功

执行生产消息 php artisan rabbitmq_producer\ 执行消费消息 hp artisan rabbitmq_consumer

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
种地上哪里去买保险? 杯弓蛇影下一句 一文读懂资管新规(内容和影响) 明股实债与对赌的理解 Leader 统帅 @G1012HBD766S 洗烘一体机 10kg 玉墨银-适用对象 Leader 统帅 @G1012HBD766S 洗烘一体机 10kg 玉墨银-详细介绍 新版资管细则要点解读 小米手机支持腾讯微博吗? 刚买的小米手机,去腾讯发了条微博,可为什么显示来自【3g.qq.com... 为什么我用小米2手机发微博,微博尾巴还是显示来自安卓客户端,而不是... 始于刘邦帝王赐给功臣世代享受优遇的免死金牌又叫什么 在sql数据库里的,查询分析器里,导出查询结果,但没有列名称,怎么才能把... 8月下雨去深圳欢乐谷不会有什么大问题吧? 深圳欢乐谷有哪些玩的 浪琴手表怎么看真假浪琴手表怎么上发条 有什么方法可以在ipad上锁住特定一个游戏软件不让别人开来玩?我老爸... 怎样限制小孩玩ipad 目前那款在线客服软件能结合3G智能手机,即使不在电脑边上也可以的呀... 客服坐席外包是什么意思? 在线通68客服其他辅助功能 无经验想问下客服网站开通后可以增加坐席吗? ...什么的啊~~ 买了数位板~可是不知道怎么用PS软件啊~~ 表砸我什么的... ...上色,但是是用相机照下来的,上不了,求大神用ps帮勾一下边!!_百度... 我刚下载了ps连什么是什么都不知道,求大师教上色(不打算教的别来) ...都显示为RGB模式,也不能新建图层,也不能上色,求解。 为什么ps填充不上色了? 批评缺少恒心和毅力的行为的成语要多的 批评的态度 成语 奇异莓能晒干吃吗 奇异莓的正确吃法有哪些 奇异莓是哪里的水果 ...一个女士在不停的编织,最后连自己的头发都用上了,最后直至把自己拽入... ...就是一个孩子不知道怎么得到了额一把绿色的凳子,坐在凳子上面... 平板电脑开机模糊一会就清楚但屏幕上方有线条 oracle数据库,字符串截取函数SUBSTR(‘SQL语言’,3,3)返回值是多少,顺 ... 度量衡是什么意思度量衡的意思是什么 ...的时候在游戏机室里玩的,记得里面人物有八神,不知火舞, ...88种人物选择,里面包括孙悟空,贝吉塔和八神庵.之类的?? 1992年4月13日8点50的上升星座 我是1992年公历4月13号农历3月11出生的,请问我是什么星座 1992年4月13日晚上11点58出生的是什么白羊 我是1992年出生的,属猴,我是什么星座啊?求大神帮助 出国后手机没信号怎么办? 我的4752g貌似有蓝牙的功能,但是不知道怎么用 洗衣机如何去除霉味 怎样才能知道QQ音乐播放器的歌曲地址??? 怎么在qq音乐软件(播放器)上查看网络音乐地址(最后面要mp3格式的)?一定... 雅马哈摩托车100型女士起动时打不叫怎么回事 雅马哈摩托车100型女士电起动时打不叫怎么回事 可达鸭认主人吗 阿波罗与太阳神有什么关系