mq类----1
MQ.php
- <?php
- /**
- * Created by PhpStorm.
- * User: brady
- * Date: 2017/12/6
- * Time: 14:42
- *
- * amqp协议操作类,可以访问rabbitMQ
- * 需先安装php_amqp扩展
- *
- */
- class MQ
- {
- //配置
- public $configs = array();
- //交换机名称
- public $exchange_name = '';
- //队列名称
- public $queue_name = '';
- //路由名称 注意 如果用同一个路由绑定交换机,当推送的时候,会同时推送到这几个key上 $q = new AMQPQueue($channel); $q->setName('queue3'); $q->setName('queue2'); $q->bind('exchange',$routingkey);
- public $route_key = '';
- //是否持久化 默认true
- public $durable = true;
- /*
- * 是否自动删除
- * exchange is deleted when all queues have finished using it
- * queue is deleted when last consumer unsubscribes
- *
- */
- public $auto_delete = false;
- //镜像队列,打开后消息会在节点之间复制,有master和slave的概念
- public $mirror = false;
- //连接
- private $_conn = NULL;
- //交换机对象
- private $_exchange = NULL;
- //信道对象
- private $_channel = NULL;
- //队列对象
- private $_queue = NULL;
- /**
- * MQ constructor.
- * @configs array('host'=>$host,'port'=>5672,'username'=>$username,'password'=>$password,'vhost'=>'/')
- */
- public function __construct($configs=array(),$exchange_name='',$queue_name='',$route_key='')
- {
- $this->exchange_name = $exchange_name;
- $this->queue_name = $queue_name;
- $this->route_key = $route_key;
- $this->set_configs($configs);
- }
- /**
- * @desc 配置设置
- * @param $configs
- */
- public function set_configs($configs)
- {
- if(empty($configs) || !is_array($configs)){
- throw new Exception("your config is not array");
- }
- if(empty($configs['host']) || empty($configs['username']) || empty($configs['password'])) {
- throw new Exception("your config is error");
- }
- if(empty($configs['vhost'])){
- $configs['vhost'] = '/';
- }
- if(empty($configs['port'])){
- $configs['port'] = '5672';
- }
- $configs['login'] = $configs['username'];
- unset($configs['username']);
- $this->configs = $configs;
- }
- /**
- * 设置是否持久化
- * @param $durable
- */
- public function set_durable($durable)
- {
- $this->durable = $durable;
- }
- /**
- * 设置是否自动删除
- * @param $auto_delete boolean
- */
- public function set_auto_delete($auto_delete)
- {
- $this->auto_delete = $auto_delete;
- }
- /**
- * 设置是否镜像
- * @param $mirror
- */
- public function set_mirror($mirror)
- {
- $this->mirror = $mirror;
- }
- /**
- * 连接初始化
- */
- public function init()
- {
- //没有连接对象,进行连接 有不管 就不用每次都连接和初始化
- if(!$this->_conn){
- $this->_conn = new AMQPConnection($this->configs);
- $this->_conn->connect();
- $this->init_exchange_queue_route();
- }
- }
- /**
- * 初始化 交换机 队列名 路由
- */
- public function init_exchange_queue_route()
- {
- if(empty($this->exchange_name) || empty($this->queue_name) || empty($this->route_key)){
- throw new Exception("rabbitMQ exchage_name or queue_name or route_key is empty, please check is",'500');
- }
- //channel
- $this->_channel = new AMQPChannel($this->_conn);//创建channel
- //exchange
- $this->_exchange = new AMQPExchange($this->_channel);//创建交换机
- $this->_exchange->setName($this->exchange_name);//设置交换机名字
- $this->_exchange->setType(AMQP_EX_TYPE_DIRECT);//交换机方式为direct
- if($this->durable) {
- $this->_exchange->setFlags(AMQP_DURABLE);//是否持久化
- }
- if($this->auto_delete){
- $this->_exchange->setFlags(AMQP_AUTODELETE);//是否自动删除
- }
- $this->_exchange->declareExchange();//申请交换机
- //queue
- $this->_queue = new AMQPQueue($this->_channel);
- $this->_queue->setName($this->queue_name);
- if($this->durable){
- $this->_queue->setFlags(AMQP_DURABLE);
- }
- if($this->auto_delete){
- $this->_queue->setFlags(AMQP_AUTODELETE);
- }
- if($this->mirror){
- $this->_queue->setArgument('x-ha-policy','all');
- }
- $this->_queue->declareQueue();//申请queue
- //绑定交换机
- $this->_queue->bind($this->exchange_name,$this->route_key);
- }
- //关闭连接
- public function close()
- {
- if($this->_conn){
- $this->_conn->disconnect();
- }
- }
- //断开连接
- public function __destruct()
- {
- // TODO: Implement __destruct() method.
- $this->close();
- }
- //生产消息
- public function send($msg)
- {
- $this->init();
- if(!$this->_conn){
- throw new Exception("connect RabbitMQ failed when send message");
- }
- if(is_array($msg)) {
- $msg = json_encode($msg);
- } else {
- $msg = trim(strval($msg));
- }
- return $this->_exchange->publish($msg,$this->route_key);
- }
- //消费消息 自动应答模式
- public function run_auto($funcation_name,$auto_ack = true)
- {
- $this->init();
- if(!$funcation_name || !$this->_queue) {
- throw new Exception("auto ack lose function_name or this->_queue");
- }
- while(true){
- if($auto_ack){
- $this->_queue->consume($funcation_name,AMQP_AUTOACK);
- } else {
- $this->_queue->consume($funcation_name);
- }
- }
- }
- }
my_pub.php
- <?php
- /**
- * Created by PhpStorm.
- * User: brady
- * Date: 2017/12/6
- * Time: 14:35
- */
- require_once "MQ.php";
- $configs = array(
- 'host'=>'192.168.33.30',
- 'port'=>5672,
- 'username'=>'title',
- 'password'=>'title',
- 'vhost'=>'/'
- );
- $number = 2;
- $config = [
- 'exchange_name'=>'brady',
- 'queue_name'=>"queue_".$number,
- 'route_key'=>"route_".$number
- ];
- $mq = new MQ($configs,$config['exchange_name'],$config['queue_name'],$config['route_key']);
- for($i=0;$i<10000;$i++){
- $res = $mq->send(date("Y-m-d H:i:s"));
- }
my_consumer.php
- <?php
- /**
- * Created by PhpStorm.
- * User: brady
- * Date: 2017/12/6
- * Time: 19:41
- */
- require_once "MQ.php";
- set_time_limit(0);
- $configs = array(
- 'host'=>'192.168.33.30',
- 'port'=>5672,
- 'username'=>'title',
- 'password'=>'title',
- 'vhost'=>'/'
- );
- $number = 2;
- $config = [
- 'exchange_name'=>'brady',
- 'queue_name'=>"queue_".$number,
- 'route_key'=>"route_".$number
- ];
- $mq = new MQ($configs,$config['exchange_name'],$config['queue_name'],$config['route_key']);
- //用类的方式
- /*class A{
- function processMessage($envelope, $queue) {
- $msg = $envelope->getBody();
- $envelopeID = $envelope->getDeliveryTag();
- $pid = posix_getpid();
- file_put_contents("log{$pid}.log", $msg.'|'.$envelopeID.''."\r\n",FILE_APPEND);
- $queue->ack($envelopeID);
- }
- }
- $a = new A();*/
- class B{
- protected $_envelope;
- protected $_queue;
- public function __construct($envelope,$queue)
- {
- $this->_queue = $queue;
- $this->_envelope = $envelope;
- }
- public function test()
- {
- $msg = $this->_envelope->getBody();
- $envelopeID = $this->_envelope->getDeliveryTag();
- $pid = posix_getpid();
- file_put_contents("log{$pid}.log", $msg.'|'.$envelopeID.''."\r\n",FILE_APPEND);
- $this->_queue->ack($envelopeID);
- }
- }
- //用函数的方式 直接在回调里面处理,也可以在回调里面,再load新的model 事务在model里面处理
- function processMessage($envelope, $queue) {
- /* $msg = $envelope->getBody();
- $envelopeID = $envelope->getDeliveryTag();
- $pid = posix_getpid();
- file_put_contents("log{$pid}.log", $msg.'|'.$envelopeID.''."\r\n",FILE_APPEND);
- $queue->ack($envelopeID); //如果设置为AMQP_AUTOACK 那么不需要该行也可以自动应答*/
- $b = new B($envelope,$queue);
- $b->test();
- }
- //$s = $ra->run(array($a,'processMessage'),false);
- $s = $mq->run_auto("processMessage",false);
ci里面回调函数可以传对象 比如$this $this->tb_users 或者赋值给一个变量后传
- public function test_get()
- {
- $obj = $this;
- set_time_limit(0);
- require_once APPPATH."/third_party/mq/RabbitMQ.php";
- $configs = array(
- 'host'=>'192.168.33.30',
- 'port'=>5672,
- 'username'=>'title',
- 'password'=>'title',
- 'vhost'=>'/'
- );
- $number = 2;
- $config = [
- 'exchange_name'=>'brady',
- 'queue_name'=>"queue_".$number,
- 'route_key'=>"route_".$number
- ];
- $ra = new RabbitMQ($configs,$config['exchange_name'],$config['queue_name'],$config['route_key']);
- $ra->run(array($obj,'processMessage'),false);
- }
后面再写篇用get手动获取和响应的ack
mq类----1的更多相关文章
- mq类----2
手动应答方式 使用get my_consumer.php 消费者 生产者和上一篇 一样 <?php /** * Created by PhpStorm. * User: brady * Dat ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- MSMQ消息队列 用法
引言 接下来的三篇文章是讨论有关企业分布式开发的文章,这三篇文章筹划了很长时间,文章的技术并不算新,但是文章中使用到的技术都是经过笔者研究实践后总结的,正所谓站在巨人的肩膀上,笔者并不是巨人,但也希望 ...
- 企业数据总线(ESB)和注册服务管理(dubbo)的区别
企业数据总线(ESB)和注册服务管理(dubbo)的区别 转载 2015年11月04日 09:05:14 7607 企业数据总线(ESB)和注册服务管理(dubbo)的区别 2015-03-09 0 ...
- Hadoop/Spark生态圈里的新气象
令人惊讶的是,Hadoop在短短一年的时间里被重新定义.让我们看看这个火爆生态圈的所有主要部分,以及它们各自具有的意义. 对于Hadoop你需要了解的最重要的事情就是 ,它不再是原来的Hadoop. ...
- 电商技术中企业数据总线ESB和注册服务管理的区别
一.概述 1.什么是ESB 就是企业数据总线的意思,他的核心功能就是兼容各种协议接口,可以将数据在各种协议之间进行流转,并且可以针对数据格式进行编排转换. 异构系统,功能繁多,复杂 代表性的项目有:J ...
- 【编码】封装RedisPubSub工具
基本介绍 核心原理:利用Redis的List列表实现,发布事件对应rpush,订阅事件对应lpop 问题一:Redis不是自带Pub/Sub吗? redis自带的pub/sub有两个问题: 1.如果发 ...
- RabbitMQ,想说爱你不容易(附详细安装教程)
前言 本文讲述的只是主要是 RabbitMQ 的入门知识,学习本文主要可以掌握以下知识点: MQ 的发展史 AMQP 协议 Rabbit MQ 的安装 Rabbit MQ 在 Java API 中的使 ...
- IBM WebSphere MQ的C#工具类以及源码(net)
简单的介绍一下MQ常用的对象 Queue Manager 队列管理器 主要负责管理队列.通道等,类似与Oracle中的Oracle实例的概念,在一台服务器中可以定义多个Queue Manager. Q ...
随机推荐
- Python+selenium之获取验证信息
通常获取验证信息用得最多的几种验证信息分别是title,URL和text.text方法用于获取标签对之间的文本信息. 代码如下: from selenium import webdriverimpor ...
- JSON 序列化格式
一.C#处理简单json数据json数据: 复制代码代码如下: {"result":"0","res_info":"ok" ...
- CentOS6.4安装JDK,卸载自带的OpenJDK
1.查看OpenJDK的安装包 $ rpm -qa |grep java java-1.6.0-openjdk-1.6.0.0-1.62.1.11.11.90.el6_4.x86_64 java-1. ...
- Python使用easy-install安装时报UnicodeDecodeError的解决方法
Python使用easy-install安装时报UnicodeDecodeError的解决方法,有需要的朋友可以参考下. 问题描述: 在使用easy-install安装matplotlib.pypar ...
- 【TensorFlow入门完全指南】模型篇·最近邻模型
最近邻模型,更为常见的是k-最近邻模型,是一种常见的机器学习模型,原理如下: KNN算法的前提是存在一个样本的数据集,每一个样本都有自己的标签,表明自己的类型.现在有一个新的未知的数据,需要判断它的类 ...
- 如何使用动画库animate.css
animate.css是一个CSS3动画库,里面预设了抖动(shake).闪烁(flash).弹跳(bounce).翻转(flip).旋转(rotateIn/rotateOut).淡入淡出(fadeI ...
- stm32F042 (二) 按键触发中断
已经实现GPIO口输出高低电平控制LED,这里实现按键触发中断来改变LED闪亮的频率,因为PB3连着LED,所以PB3的输出模式没有改变,随意选一个GPIO口PA7接按键产生中断.因为nucleo开发 ...
- Python——函数入门(二)
一.函数的参数 我们在定义函数时,可以定义形式参数(简称形参),这些形参的值在函数调用的时候才会确定,形参的值由调用者负责传入. 1.关键字参数 在Python中,函数的参数名并不是没有意义的,在调用 ...
- skynet 学习笔记-sproto模块(2)
云风在skynet中继承了sproto的传输协议,对比protobuf的好处是,能明文看到传输内容,而且skynet不需要protobuf这么功能,所以云风也建议在lua层使用sproto来作为sky ...
- python元组的相对不可变性
元组与多数python集合(列表.字典.集,等等)一样,保存的是对象的引用.如果引用的元素是可变的,即便元组本身不可变,但是元素依然可变.也就是说元组的不可变性其实是指tuple数据结构的物理内容(即 ...