php使用RabbitMQ
<p class="p">RabbitMQ<span style="font-family: 宋体">简要概括</span></p><p class="p">1、AMQP:Advanced Message Queuing Protocol,是一个提供统一消息服务的应用层标准协议。</p>
<p class="p">2、IPC(单一系统进程间通信) -> socket(不同机器间进程通信) -> AMQP(解决大型系统模块与组件间通信)</p>
<p class="p">3、RabbitMQ 基于 Erlang 开发,是 AMQP 的一个开源实现。</p>
<p class="p">4、RabbitMQ 系统架构图:</p>
<p class="p"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161006689-1473136555.png"></p>
<p> </p>
<p> </p>
<p class="p">5、名词术语:</p>
<ul>
<li>RabbitMQ Server(broker server):维护一条从 Producer 到 Consumer 的路线,保证数据能够按照指定的方式进行传输;</li>
<li>Client A & B:数据发送方,Producers create messages and publish (send) them to a broker server (RabbitMQ),一个有效的 Message 包含 payload 和 label 两部分</li>
<li>Client 1、2、3:数据消费方,Consumers attach to a broker server (RabbitMQ) and subscribe to a queue</li>
<li>Exchange:Exchanges are where producers publish their messages</li>
<li>Queue: Queues are where the messages end up and are received by consumers</li>
<li>Binding:Bindings are how the messages get routed from the exchange to particular queues</li>
</ul>
<p class="p"><span style="font-family: "Helvetica Neue"">还有几个隐式的概念:</span></p>
<ul>
<li>Connection:Producer 和 Consumer 通过 TCP 连接到 RabbitMQ</li>
<li>Channel:它建立在上述的 TCP 连接中,数据流动都是在 Channel 中进行的</li>
</ul>
<p class="p"><span style="font-family: "Helvetica Neue"">此外,</span>Exchanges 分三种类型:</p>
<ul>
<li>direct:如果 routing key 匹配,那么 Message 就会被传递到相应的 queue</li>
<li>fanout:会向响应的 queue 广播</li>
<li>topic:对 key 进行模式匹配,比如 ab* 可以传递到所有 ab* 的 queue</li>
</ul>
<p align="justify"> </p>
<p class="p">RabbitMQ<span style="font-family: 宋体">安装使用</span></p>
<p class="p"><span style="font-family: 宋体">第一步:下载并安装</span>erlang</p>
<p class="p"><span style="font-family: 宋体">原因:</span>RabbitMQ<span style="font-family: 宋体">服务端代码是使用并发式语言</span><span style="font-family: Calibri">Erlang</span><span style="font-family: 宋体">编写的,安装</span><span style="font-family: Calibri">Rabbit MQ</span><span style="font-family: 宋体">的前提是安装</span><span style="font-family: Calibri">Erlang</span><span style="font-family: 宋体">。</span></p>
<p class="p"><span style="font-family: 宋体">下载地址:</span>http://www.erlang.org/downloads</p>
<p class="p"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161058465-429359493.png"></p>
<p> </p>
<p> </p>
<p class="p"><span style="font-family: 宋体">根据本机位数选择</span>erlang<span style="font-family: 宋体">下载版本。</span></p>
<p class="p"><span style="font-family: 宋体">下载完是这么个东西:</span></p>
<p class="p"><span style="font-family: 宋体"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161131431-319521164.png"></span></p>
<p> </p>
<p class="p"> </p>
<p> </p>
<p><span style="font-family: 宋体">双击,点</span>next<span style="font-family: 宋体">就可以。</span></p>
<p><span style="font-family: 宋体"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161211089-1374244774.png"></span></p>
<p> </p>
<p> </p>
<p> </p>
<p class="p"><span style="font-family: 宋体">选择一个自己想保存的地方,然后</span>next<span style="font-family: 宋体">、</span><span style="font-family: Calibri">finish</span><span style="font-family: 宋体">就可以。</span></p>
<p class="p"><span style="font-family: 宋体"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161240913-220040739.png"></span></p>
<p> </p>
<p class="p"> </p>
<p> </p>
<p class="p"><span style="font-family: 宋体">安装完事儿后要记得配置一下系统的环境变量。</span></p>
<p class="p"><span style="font-family: 宋体">此电脑</span>--><span style="font-family: 宋体">鼠标右键</span><span style="font-family: Calibri">“</span><span style="font-family: 宋体">属性</span><span style="font-family: Calibri">”--></span><span style="font-family: 宋体">高级系统设置</span><span style="font-family: Calibri">--></span><span style="font-family: 宋体">环境变量</span><span style="font-family: Calibri">-->“</span><span style="font-family: 宋体">新建</span><span style="font-family: Calibri">”</span><span style="font-family: 宋体">系统环境变量</span></p>
<p class="p"><span style="font-family: 宋体"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161311382-1275501124.png"></span></p>
<p> </p>
<p class="p"> </p>
<p> </p>
<p class="p"><span style="font-family: 宋体">变量名:</span>ERLANG_HOME</p>
<p class="p"><span style="font-family: 宋体">变量值就是刚才</span>erlang<span style="font-family: 宋体">的安装地址,点击确定。</span></p>
<p class="p"><span style="font-family: 宋体">然后双击系统变量</span>path</p>
<p class="p"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161338782-890400289.png"></p>
<p> </p>
<p> </p>
<p class="p"><span style="font-family: 宋体">点击</span>“<span style="font-family: 宋体">新建</span><span style="font-family: Calibri">”</span><span style="font-family: 宋体">,将</span><span style="font-family: Calibri">%ERLANG_HOME%\bin</span><span style="font-family: 宋体">加入到</span><span style="font-family: Calibri">path</span><span style="font-family: 宋体">中。</span></p>
<p class="p"><span style="font-family: 宋体"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161406471-1812598209.png"></span></p>
<p> </p>
<p class="p"> </p>
<p> </p>
<p><span style="font-family: 宋体">最后</span>windows<span style="font-family: 宋体">键</span><span style="font-family: "Times New Roman"">+R</span><span style="font-family: 宋体">键,输入</span><span style="font-family: "Times New Roman"">cmd</span><span style="font-family: 宋体">,再输入</span><span style="font-family: "Times New Roman"">erl</span><span style="font-family: 宋体">,看到版本号就说明</span><span style="font-family: "Times New Roman"">erlang</span><span style="font-family: 宋体">安装成功了。</span></p>
<p><span style="font-family: 宋体"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161437027-1066756303.png"></span></p>
<p> </p>
<p> </p>
<p> </p>
<p class="p"><span style="font-family: 宋体">第二步:下载并安装</span>RabbitMQ</p>
<p class="p"><span style="font-family: 宋体">下载地址:</span><span style="text-decoration: underline">http://www.rabbitmq.com/download.html</span></p>
<p class="p"> </p>
<p class="p"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161510180-4050837.png"></p>
<p> </p>
<p> </p>
<p class="p"><span style="font-family: 宋体">双击下载后的</span>.exe<span style="font-family: 宋体">文件,安装过程与</span><span style="font-family: Calibri">erlang</span><span style="font-family: 宋体">的安装过程相同。</span></p>
<p class="p">RabbitMQ<span style="font-family: 宋体">安装好后接下来安装</span><span style="font-family: Calibri">RabbitMQ-Plugins</span><span style="font-family: 宋体">。打开命令行</span><span style="font-family: Calibri">cd</span><span style="font-family: 宋体">,输入</span><span style="font-family: Calibri">RabbitMQ</span><span style="font-family: 宋体">的</span><span style="font-family: Calibri">sbin</span><span style="font-family: 宋体">目录。</span></p>
<p class="p"><span style="font-family: 宋体">我的目录是:</span>D:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.3\sbin</p>
<p class="p"><span style="font-family: 宋体">然后在后面输入</span>rabbitmq-plugins enable rabbitmq_management<span style="font-family: 宋体">命令进行安装</span></p>
<p class="p"> </p>
<p class="p"><span style="font-family: 宋体"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161547291-514922591.png"></span></p>
<p> </p>
<p class="p"> </p>
<p> </p>
<p class="p"><span style="font-family: 宋体">打开</span>sbin<span style="font-family: 宋体">目录,双击</span><span style="font-family: Calibri">rabbitmq-server.bat</span></p>
<p class="p"><span style="font-family: Calibri"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161641087-1016538915.png"></span></p>
<p> </p>
<p class="p"> </p>
<p> <span style="font-family: 宋体">等几秒钟看到这个界面后,访问</span>http://localhost:15672</p>
<p class="p"><span style="font-family: 宋体">然后可以看到如下界面</span></p>
<p><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161703715-2147374391.png"></p>
<p> </p>
<p> </p>
<p class="p"><span style="font-family: 宋体">默认用户名和密码都是</span>guest</p>
<p class="p"><span style="font-family: 宋体">登陆即可。</span></p>
<p class="p"><span style="font-family: Tahoma">安装</span>php扩展amqp</p>
<p class="p"><span style="font-family: Tahoma">先查看自己的</span>php版本</p>
<p class="p"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161728913-1981237125.png"></p>
<p> </p>
<p> </p>
<p class="p"><strong><span class="15"><span style="font-family: Tahoma">记住版本</span> 至于这个线程安全问题 这里引用了别人的自己看看吧 </span></strong>http://blog.csdn.net/aoyoo111/article/details/19021295</p>
<p class="p"><strong><span class="15"><span style="font-family: Tahoma">接下来下载</span>dll文件 地址</span></strong>http://pecl.php.net/package/amqp</p>
<p class="p"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161802237-741907074.png"></p>
<p class="p"> </p>
<p class="p"><strong><span class="15"><span style="font-family: Tahoma">下载稳定版的,点击</span>DLL</span></strong></p>
<p class="p"><strong><span class="15"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161828951-2005909976.png"></span></strong></p>
<p> </p>
<p> </p>
<p class="p"><strong><span class="15">php版本 ,X86 和X64 根据自己情况 , NTS 和 TS 就是那个thread safty 的状态 这个大家都会看吧 就不多说了</span></strong></p>
<p class="p"><strong><span class="15"><span style="font-family: Tahoma">下载解压</span></span></strong></p>
<p class="p"><strong><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161900864-940753652.png"></strong></p>
<p> </p>
<p> </p>
<p><strong><span style="font-family: Tahoma">将</span>php_amqp.dll文件放到php目录的ext文件夹下 见下图:</strong></p>
<p><strong><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161933528-1368005788.png"></strong></p>
<p> </p>
<p> </p>
<p class="p"> <strong><span class="15"><span style="font-family: Tahoma">将</span>rabbitmq.4.dll文件放到php根目录 见下图:</span></strong></p>
<p class="p"><strong><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918161953198-1957972036.png"></strong></p>
<p> </p>
<p> </p>
<p class="p"> <strong><span class="15">php.ini里面添加</span></strong> </p>
<p class="p"><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918162020811-1970843283.png"></p>
<p> </p>
<p> </p>
<p><strong>apache 修改http.conf 文件 添加</strong></p>
<p><strong><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918162046270-560957054.png"></strong></p>
<p> </p>
<p> </p>
<p><span style="font-family: Tahoma">之后重启</span>apache </p>
<p><img src="https://img2018.cnblogs.com/blog/1361035/201909/1361035-20190918162102433-842533355.png"></p>
<p> </p>
<p> </p>
<h1><strong><span style="font-family: Tahoma">在</span></strong>php 中使用Rabbitmq<strong><span style="font-family: Tahoma">实现</span></strong><span style="font-family: "Helvetica Neue"">实现消息发送和接收</span></h1>
<p>1,建立一个send.php文件用来发送消息</p>
<p>2,建立一个 receive.php <span style="font-family: "Helvetica Neue"">文件用来接收消息</span></p>
<p><span style="font-family: "Helvetica Neue"">代码如下</span></p>
<p class="p"><strong>send.php</strong></p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 发送消息
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(128, 0, 128, 1)">$exchangeName</span> = 'demo'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$routeKey</span> = 'hello'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$message</span> = 'Hello World!'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 建立TCP连接</span>
<span style="color: rgba(128, 0, 128, 1)">$connection</span> = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AMQPConnection([
</span>'host' => 'localhost',
'port' => '5672',
'vhost' => '/',
'login' => 'guest',
'password' => 'guest'<span style="color: rgba(0, 0, 0, 1)">
]);
</span><span style="color: rgba(128, 0, 128, 1)">$connection</span>->connect() or <span style="color: rgba(0, 0, 255, 1)">die</span>("Cannot connect to the broker!\n"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(128, 0, 128, 1)">$channel</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> AMQPChannel(<span style="color: rgba(128, 0, 128, 1)">$connection</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$exchange</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> AMQPExchange(<span style="color: rgba(128, 0, 128, 1)">$channel</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$exchange</span>->setName(<span style="color: rgba(128, 0, 128, 1)">$exchangeName</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$exchange</span>-><span style="color: rgba(0, 128, 128, 1)">setType</span><span style="color: rgba(0, 0, 0, 1)">(AMQP_EX_TYPE_DIRECT);
</span><span style="color: rgba(128, 0, 128, 1)">$exchange</span>-><span style="color: rgba(0, 0, 0, 1)">declareExchange();
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> 'Send Message: ' . <span style="color: rgba(128, 0, 128, 1)">$exchange</span>->publish(<span style="color: rgba(128, 0, 128, 1)">$message</span>, <span style="color: rgba(128, 0, 128, 1)">$routeKey</span>) . "\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "Message Is Sent: " . <span style="color: rgba(128, 0, 128, 1)">$message</span> . "\n"<span style="color: rgba(0, 0, 0, 1)">;
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span> (AMQPConnectionException <span style="color: rgba(128, 0, 128, 1)">$e</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">var_dump</span>(<span style="color: rgba(128, 0, 128, 1)">$e</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(128, 0, 128, 1)">$connection</span>->disconnect();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 断开连接</span></pre>
</div>
<p class="p"><strong><span class="15">receive.php</span></strong></p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 接收消息
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(128, 0, 128, 1)">$exchangeName</span> = 'demo'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$queueName</span> = 'hello'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$routeKey</span> = 'hello'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 建立TCP连接</span>
<span style="color: rgba(128, 0, 128, 1)">$connection</span> = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AMQPConnection([
</span>'host' => 'localhost',
'port' => '5672',
'vhost' => '/',
'login' => 'guest',
'password' => 'guest'<span style="color: rgba(0, 0, 0, 1)">
]);
</span><span style="color: rgba(128, 0, 128, 1)">$connection</span>->connect() or <span style="color: rgba(0, 0, 255, 1)">die</span>("Cannot connect to the broker!\n"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$channel</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> AMQPChannel(<span style="color: rgba(128, 0, 128, 1)">$connection</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$exchange</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> AMQPExchange(<span style="color: rgba(128, 0, 128, 1)">$channel</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$exchange</span>->setName(<span style="color: rgba(128, 0, 128, 1)">$exchangeName</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$exchange</span>-><span style="color: rgba(0, 128, 128, 1)">setType</span><span style="color: rgba(0, 0, 0, 1)">(AMQP_EX_TYPE_DIRECT);
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> 'Exchange Status: ' . <span style="color: rgba(128, 0, 128, 1)">$exchange</span>->declareExchange() . "\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$queue</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> AMQPQueue(<span style="color: rgba(128, 0, 128, 1)">$channel</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$queue</span>->setName(<span style="color: rgba(128, 0, 128, 1)">$queueName</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> 'Message Total: ' . <span style="color: rgba(128, 0, 128, 1)">$queue</span>->declareQueue() . "\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> 'Queue Bind: ' . <span style="color: rgba(128, 0, 128, 1)">$queue</span>->bind(<span style="color: rgba(128, 0, 128, 1)">$exchangeName</span>, <span style="color: rgba(128, 0, 128, 1)">$routeKey</span>) . "\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">var_dump</span>("Waiting for message..."<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 消费队列消息</span>
<span style="color: rgba(0, 0, 255, 1)">while</span>(<span style="color: rgba(0, 0, 255, 1)">TRUE</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(128, 0, 128, 1)">$queue</span>->consume('processMessage'<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 断开连接</span>
<span style="color: rgba(128, 0, 128, 1)">$connection</span>-><span style="color: rgba(0, 0, 0, 1)">disconnect();
</span><span style="color: rgba(0, 0, 255, 1)">function</span> processMessage(<span style="color: rgba(128, 0, 128, 1)">$envelope</span>, <span style="color: rgba(128, 0, 128, 1)">$queue</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(128, 0, 128, 1)">$msg</span> = <span style="color: rgba(128, 0, 128, 1)">$envelope</span>-><span style="color: rgba(0, 0, 0, 1)">getBody();
</span><span style="color: rgba(0, 128, 128, 1)">var_dump</span>("Received: " . <span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$queue</span>->ack(<span style="color: rgba(128, 0, 128, 1)">$envelope</span>->getDeliveryTag()); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 手动发送ACK应答</span>
}</pre>
</div>
<p class="p"><span style="font-family: "Helvetica Neue"">测试:</span></p>
<p class="p"><span style="font-family: "Helvetica Neue"">打开两个终端,先运行接收者脚本监听消息发送:</span></p>
<p class="pre">php receive.php</p>
<p><span style="font-family: "Helvetica Neue"">在另一个终端中运行消息发送脚本:</span></p>
<p class="pre">php send.php</p>
<p class="p"> </p>
<p> </p>
<p class="p"> </p><br><br>
来源:https://www.cnblogs.com/dawuge/p/11543266.html
頁:
[1]