php rabbitmq 封装,封装php的RabbitMq

static private $_instance;static private $_conn;static private $amp;static private $route = 'key_1';static private $q;static private $ex;static private $queue;public static functiongetInstance(){global $arr;if (!(self::$_instanceinstanceof self)) {

self::$_instance = new self($arr['RabbitMq']);return self::$_instance;

}return self::$_instance;

}private function __construct($conn)

{//创建连接和channel

$conn = new AMQPConnection($conn);if(!$conn->connect()) {die("Cannot connect to the broker!\n");

}

self::$_conn = new AMQPChannel($conn);

self::$amp = $conn;

}/**

*

* parm 交换机名

* parm 队列名

*

**/

public function listen($exchangeName,$queuename){

self::$queue = $queuename;return $this->setExchange($exchangeName,$queuename);

}//连接交换机

public function setExchange($exchangeName,$queueName){//创建交换机

$ex = new AMQPExchange(self::$_conn);

self::$ex = $ex;$ex->setName($exchangeName);$ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型

$ex->setFlags(AMQP_DURABLE); //持久化

$ex->declare();return self::setQueue($queueName,$exchangeName);

}//创建队列

private static function setQueue($queueName,$exchangeName){//创建队列

$q = new AMQPQueue(self::$_conn);$q->setName($queueName);$q->setFlags(AMQP_DURABLE);$q->declareQueue();//用于绑定队列和交换机

$routingKey = self::$route;$q->bind($exchangeName, $routingKey);

self::$q = $q;return(self::$_instance);

}/** 消费者

* $fun_name = array($classobj,$function) or function name string

* $autoack 是否自动应答

*

* function processMessage($envelope, $queue) {

$msg = $envelope->getBody();

echo $msg."\n"; //处理消息

$queue->ack($envelope->getDeliveryTag());//手动应答

}*/

public function run($func, $autoack = True){if (!$func || !self::$q) return False;while(True){if ($autoack) {if(!self::$q->consume($func,AMQP_AUTOACK)){//self::$q->ack($envelope->getDeliveryTag());

//失败之后会默认进入 noack 队列。下次重新开启会再次调用,目前还不清楚 回调配置应该这里做一个失败反馈

//todu

}

}

self::$q->consume($func);

}

}private static functioncloseConn(){

self::$amp->disconnect();

}public function pushlish($msg){while (1) {sleep(1);if (self::$ex->publish(date('H:i:s') . "用户" . "注册", self::$route)) {//写入文件等操作

echo $msg;

}

}

}//__clone方法防止对象被复制克隆

public function__clone()

{trigger_error('Clone is not allow!', E_USER_ERROR);

}

}

rabbitmq(MQ)全称为Message Queue, 消息队列是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。<?php namespace PhpAmqpLib\Connection; class AMQPLazyConnection extends AMQPStreamConnection {     /**      * Gets socket from current connection      *      * @deprecated      */     public function getSocket()     {         $this->connect();         return parent::getSocket();     }     /**      * {@inheritdoc}      */     public function channel($channel_id = null)     {         $this->connect();         return parent::channel($channel_id);     }     /**      * @return null|\PhpAmqpLib\Wire\IO\AbstractIO      */     protected function getIO()     {         if (empty($this->io)) {             $this->connect();         }         return $this->io;     }     /**      * Should the connection be attempted during construction?      *      * @return bool      */     public function connectOnConstruct()     {         return false;     } }
RabbitMQ 是一个开源的消息队列系统,它使用 AMQP(Advanced Message Queuing Protocol)来进行消息的传递。RabbitMQ 提供了丰富的功能和灵活性,但在使用时可能需要一些封装来简化操作和提高开发效率。 在封装 RabbitMQ 时,可以考虑以下几个方面: 1. 连接管理:封装连接管理可以处理连接的建立和关闭,以及连接的断开重连等情况。这样可以避免在每次使用 RabbitMQ 时都手动创建和关闭连接,提高代码的可维护性。 2. 队列声明和绑定:封装队列的声明和绑定操作可以简化创建队列和绑定交换机的过程。可以提供一个统一的接口,传入队列名称、交换机名称等参数,封装具体的操作细节。 3. 消息发送和接收:封装消息的发送和接收过程可以提供简单易用的接口,隐藏底层的细节。可以提供异步发送和接收的方式,支持回调函数或事件监听机制,方便处理消息的处理逻辑。 4. 错误处理和重试:封装错误处理和重试机制可以增加消息传递的可靠性。当消息发送或接收失败时,可以进行重试或记录错误日志,确保消息不会丢失。 5. 消费者管理:封装消费者的管理可以简化消费者的创建和启动过程。可以提供一个统一的接口,传入消费者处理函数,封装具体的消费者启动和处理逻辑。 6. 消息确认和拒绝:封装消息的确认和拒绝机制可以确保消息的可靠传递。可以提供自动确认或手动确认的方式,确保消息被正确处理。 以上是一些常见的封装思路,具体的封装方式可以根据实际需求和项目情况进行调整和扩展。在封装时,可以参考一些已有的 RabbitMQ 封装库,如 Spring AMQP 等,也可以根据自己的需求进行定制化封装
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值