写点什么

PHP 快速使用 RabbitMQ 实现项目中部分业务的解耦

作者:北桥苏
  • 2023-05-12
    广东
  • 本文字数:2394 字

    阅读完需:约 8 分钟

前言


上次介绍了 RabbitMQ 在 windows 下的安装,以及 PHP 的 AMQP 扩展的添加。这里将本地测试的代码放到了服务,所以也就是在 Linux 上再装一遍。但是这里就省掉直接进入使用。主要是 RabbitMQ 安装完毕后,管控台的使用以及在 PHP 中如何调用其接口实现消息的生产和消费。


步骤


  • Linux 安装完 rabbitMQ 后,没有配置文件,需要去 github(https://github.com/rabbitmq/rabbitmq-server/tree/master/docs)上将 rabbitmq.conf.example 复制下载下来改为 rabbitmq.conf。

  • 可以修改默认 Vhost 和管理员默认账号密码,最重要的是要将管理员开放给所有 IP 都可以登录(默认是只能是本地可以登录),修改方式如下。

  • 进入到管控台后,先创建 vhost,点击 admin,侧栏框点击 Virtual Hosts。





  • 添加 Exchanges,先选择对应的 Vhost

  • 添加队列,选择 Queues,选择对应的 Vhost

  • 队列添加完毕后选择其中一个添加的名称进入。

  • 绑定之前的 Exchanges 中其中一个,输入 exchanges 名字和自定义一个路由 Key。

  • 成功后就可以通过 PHP 代码生产消息到该虚拟机,然后经过交换机路由到该队列中。

<?php

namespace rabbitmq;

class Amq{ /** * @var object 对象实例 */ protected static $instance;
protected $exchange='router_visit'; // 交换机(需要在队列中绑定) protected $queue ='visit_log'; // 队列 protected $route ='router_visit'; // 路由key(需要在队列中绑定) protected $consumer_tag='consumer'; protected $config = [ 'host' => '146.53.206.264', 'port' => 5672, 'login' => 'guest', //guest 'password' => 'guest', //Na18gR@9tf 'vhost' => 'log', 'amqp_debug' => true ]; protected $exchange_index = 0; protected $exchange_type = [ 'direct', 'fanout', 'topic', 'headers' ];
/** * @note 实例化 * @author: beiqiaosu * @since: 2019/11/13 16:10 */ public static function getInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self(); } return self::$instance; }
/** * @Notes: 消息生产 */ public function publisher($message,$config=[]) { //如果有配置就用新配置 $this->config ['vhost'] = $config['vhost']?? $this->config ['vhost']; $this->exchange = $config['exchange']?? $this->exchange; $this->queue = $config['queue']?? $this->queue;
$this->consumer_tag = $config['consumer_tag']?? $this->consumer_tag; $this->route = $config['route']?? $this->route; $this->exchange_index = $config['exchange_index']?? $this->exchange_index;
$cnn = new \AMQPConnection($this->config); if (!$cnn->connect()) { echo "Cannot connect to the broker"; exit(); }
$channel = new \AMQPChannel($cnn); $ex = new \AMQPExchange($channel); $ex->setName($this->exchange);
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型
$ex->setFlags(AMQP_DURABLE); //持久化 $ex->declareExchange(); return "Send Message:".$ex->publish($message, $this->route, AMQP_NOPARAM, array('delivery_mode' => 2))."\n"; }

/** * @note 消费 * @author: tata * @since: 2019/11/13 16:10 */ public function consumer() {
$exchange='router_visit'; //交换机 $queue ='visit_log'; //队列 $route ='router_visit'; //路由
//连接broker $cnn = new \AMQPConnection($this->config); if (!$cnn->connect()) { echo "Cannot connect to the broker"; exit(); } $channel = new \AMQPChannel($cnn); $ex = new \AMQPExchange($channel); //设置交换机名称 $ex->setName($exchange); //设置交换机类型 //AMQP_EX_TYPE_DIRECT:直连交换机 //AMQP_EX_TYPE_FANOUT:扇形交换机 //AMQP_EX_TYPE_HEADERS:头交换机 //AMQP_EX_TYPE_TOPIC:主题交换机 $ex->setType(AMQP_EX_TYPE_DIRECT); //设置交换机持久 $ex->setFlags(AMQP_DURABLE); //声明交换机 $ex->declareExchange(); //创建一个消息队列 $q = new \AMQPQueue($channel); //设置队列名称 $q->setName($queue); //设置队列持久 $q->setFlags(AMQP_DURABLE); //声明消息队列 //$q->declareQueue(); //交换机和队列通过$route进行绑定 $q->bind($exchange, $route);
$ret = $q->consume(function($envelope, $queue) {
// 取出消息主题转为数组// $origin_data = json_decode($envelope->getBody(),true);// dump($envelope->getBody());die;
/**对消息主题执行业务**/ $res = true; /**对消息主题执行业务**/
// 业务处理完毕发送给MQ消费掉该消息 if ($res) $queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答 });
dump($ret);die;
$cnn->disconnect(); }
}
复制代码
  •  每执行一次生产或消费代码,可以在 Queue 中的统计或图表中看到,测试代码是否成功。



 

用户头像

北桥苏

关注

公众号:ZERO开发 2023-05-08 加入

专注后端实战技术分享,不限于PHP,Python,JavaScript, Java等语言,致力于给猿友们提供有价值,有干货的内容。

评论

发布
暂无评论
PHP快速使用RabbitMQ实现项目中部分业务的解耦_php_北桥苏_InfoQ写作社区