php使用rabbitmq

这里使用的是 php-amqplib

复制代码
 composer require php-amqplib/php-amqplib

生产端send.php

复制代码
<?php

require_once "./vendor/autoload.php";

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

//交换机名称
$exc_name = 'exchange.canal';
//路由键
$routing_key = 'canal-routing-key';
//队列名称
$queue_key = 'canal_queue';

//生产者
//Connection: publisher/consumer和broker之间的TCP连接
//Channel: 如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。
//Channel是在connection内部建立的逻辑连接Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。

//1.建立connction
/**
 * 主要参数说明:
 * $host:  RabbitMQ服务器主机IP地址
 * $port:  RabbitMQ服务器端口
 * $user:  连接RabbitMQ服务器的用户名
 * $password:  连接RabbitMQ服务器的用户密码
 * $vhost:   连接RabbitMQ服务器的vhost(服务器可以有多个vhost,虚拟主机,类似nginx的vhost)
 */
$connection = new AMQPStreamConnection('192.168.0.105', 5672, 'admin', 'admin', "/");
//2.建立通道Channel
$channel = $connection->channel();

//3.声明交换器
/**
 * exchange_declare($exchange, $type, $passive = false, $durable = false, $auto_delete = true, $internal = false, $nowait = false, $arguments = array(), $ticket = null) 。
 * 试探性申请一个交换器,若该交换器不存在,则创建;若存在,则跳过。
 * 主要参数说明:
 * $exchange:队列名称
 * $type 交换器类型,常见类型如:fanout,dircet,topic,hraders四种
 * $passive 只判断不创建,一般是判断该交换机是否存在
 * $durable:是否开启持久化 设置true表示持久化,反之非持久化。持久化可以将交换器存盘,在服务器重启的适合不会丢失相关数据。
 * $auto_delete:是否自动删除
 * $internal:设置是否内置,设置true表示内置交换器,客户端程序无法直接发送消息到这个交换器中,只能通过交换器路由到交换器这个方式
 * $nowait:如果为true表示不等待服务器回执信息,函数将返回NULL,可提高访问速度。
 */
$channel->exchange_declare($exc_name, 'direct', false, true, false);

//4.声明队列
/**
 * queue_declare($queue, $passive = false, $durable = false, $exclusive = false, $auto_delete = true, $nowait = false, $arguments = null, $ticket = null)
 * 试探性申请一个队列,若该队列不存在,则创建;若存在,则跳过。
 * 主要参数说明:
 * $queue:队列名称
 * $passive 只判断不创建,一般是判断该队列是否存在
 * $durable:是否开启持久化 设置true表示持久化,反之非持久化。持久化可以将队列存盘,在服务器重启的适合不会
 * $exclusive:是否独占,设置true表示独占,只能有一个消费者监听该队列,false表示共享,可以有多个消费者监听该队列。
 */
$channel->queue_declare($queue_key, false, true, false, false);

//5.绑定队列到交换器
/**
 * queue_bind($queue, $exchange, $routing_key = '', $nowait = false, $arguments = null, $ticket = null)
 * 绑定队列到交换器
 * 主要参数说明:
 * $queue:队列名称
 * $exchange:交换器名称
 * $routing_key:路由键
 */
$channel->queue_bind($queue_key, $exc_name, $routing_key);

//4.创建消息
$content = 'this is ' . $routing_key . ' message';
/**
 * 主要参数说明:
 *  data:消息
 *  properties Array 设置的属性,比如设置该消息是否持久化
 * DELIVERY_MODE_NON_PERSISTENT 不持久化
 * DELIVERY_MODE_PERSISTENT 持久化
 */
$msg = new AMQPMessage($content, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_NON_PERSISTENT]);

//5.发布消息
/**
 * basic_publish主要参数说明:
 * $msg 消息内容
 * $exchange 交换器
 * $routing_key routing_key或者队列名称
 * $mandatory 匹配不到队列时,是否立即丢弃消息
 * $immediate 队列无消费者时,是否立即丢弃消息
 * $ticket 不清楚是什么作用
 */
$channel->basic_publish($msg, $exc_name, $routing_key);
//7.通道关闭
$channel->close();
//8.连接关闭
$connection->close();

消费端receive.php

复制代码
<?php
require_once "./vendor/autoload.php";

use PhpAmqpLib\Connection\AMQPStreamConnection;

//交换机名称
$exc_name  = 'exchange.canal';
//路由键
$routing_key = 'canal-routing-key';

//1.建立connction
$connection = new AMQPStreamConnection('192.168.0.105', 5672, 'admin', 'admin', "/");
//2.建立通道Channel
$channel = $connection->channel();

//3.声明交换器
$channel->exchange_declare($exc_name, 'direct', false, true, false);

//4.获取系统生成的消息队列名称,这里也可以指定一个队列名称
list($queue_name, ,) = $channel->queue_declare('', false, true, true, false);

//5.将队列名与交换器名进行绑定,并指定routing_key
$channel->queue_bind($queue_name,$exc_name,$routing_key);

//6.设置消费成功后才能继续进行下一个消费
$channel->basic_qos(null, 1, null);

//7.定义收到消息回调函数
$callback = function ($msg) {
    echo 'received = ', $msg->body . "\n";
    //确认消息已被消费,从生产队列中移除
    $msg->ack();
};

//8.开启消费no_ack=false,设置为手动应答
$channel->basic_consume($queue_name, '', false, false, false, false, $callback);

//9.不断的循环进行消费
while ($channel->is_open()) {
    $channel->wait();
}

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

参考文章

相关推荐
两个人的幸福2 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo4 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack4 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982075 天前
PHP 扩展——从入门到理解
php
鹏仔先生6 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下6 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip6 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒6 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2506 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis6 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel