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();

参考文章

相关推荐
魔众10 小时前
ModStartCMS v9.7.0 组件升级优化,模块升级提醒,访问明细导出
php·cms
一人の梅雨13 小时前
京东商品详情深度解析:从接口调用到商业价值挖掘的技术实现
服务器·数据库·php
帅帅梓13 小时前
docker网络
网络·docker·php
吃鱼吃鱼吃不动了15 小时前
什么是负载均衡?
开发语言·php
BingoGo17 小时前
PHP 开发者应该理解的 Linux 入门权限指南
后端·php
苏琢玉18 小时前
再也不用翻一堆日志!一键部署轻量级错误监控系统,帮你统一管理 PHP 报错
go·github·php
JaguarJack19 小时前
PHP 开发者应该理解的 Linux 入门权限指南
后端·php
2301_7931679920 小时前
网络管理部分
linux·运维·服务器·网络·php
李白你好1 天前
一款基于 PHP 的轻量级Webshell管理工具
php
星光一影2 天前
【OA办公系统】神点企业OA办公助手/全开源
mysql·nginx·开源·php·源代码管理