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的更多相关文章

  1. mq类----2

    手动应答方式 使用get my_consumer.php 消费者  生产者和上一篇 一样 <?php /** * Created by PhpStorm. * User: brady * Dat ...

  2. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  3. MSMQ消息队列 用法

    引言 接下来的三篇文章是讨论有关企业分布式开发的文章,这三篇文章筹划了很长时间,文章的技术并不算新,但是文章中使用到的技术都是经过笔者研究实践后总结的,正所谓站在巨人的肩膀上,笔者并不是巨人,但也希望 ...

  4. 企业数据总线(ESB)和注册服务管理(dubbo)的区别

    企业数据总线(ESB)和注册服务管理(dubbo)的区别 转载 2015年11月04日 09:05:14 7607  企业数据总线(ESB)和注册服务管理(dubbo)的区别 2015-03-09 0 ...

  5. Hadoop/Spark生态圈里的新气象

    令人惊讶的是,Hadoop在短短一年的时间里被重新定义.让我们看看这个火爆生态圈的所有主要部分,以及它们各自具有的意义. 对于Hadoop你需要了解的最重要的事情就是 ,它不再是原来的Hadoop. ...

  6. 电商技术中企业数据总线ESB和注册服务管理的区别

    一.概述 1.什么是ESB 就是企业数据总线的意思,他的核心功能就是兼容各种协议接口,可以将数据在各种协议之间进行流转,并且可以针对数据格式进行编排转换. 异构系统,功能繁多,复杂 代表性的项目有:J ...

  7. 【编码】封装RedisPubSub工具

    基本介绍 核心原理:利用Redis的List列表实现,发布事件对应rpush,订阅事件对应lpop 问题一:Redis不是自带Pub/Sub吗? redis自带的pub/sub有两个问题: 1.如果发 ...

  8. RabbitMQ,想说爱你不容易(附详细安装教程)

    前言 本文讲述的只是主要是 RabbitMQ 的入门知识,学习本文主要可以掌握以下知识点: MQ 的发展史 AMQP 协议 Rabbit MQ 的安装 Rabbit MQ 在 Java API 中的使 ...

  9. IBM WebSphere MQ的C#工具类以及源码(net)

    简单的介绍一下MQ常用的对象 Queue Manager 队列管理器 主要负责管理队列.通道等,类似与Oracle中的Oracle实例的概念,在一台服务器中可以定义多个Queue Manager. Q ...

随机推荐

  1. Android商城开发系列(五)—— 商城首页回到顶部和搜索框布局实现

    今天我们来开发商城的首页[输入搜索框]布局和点击右下角图片回到顶部的效果 搜索功能在App中很常见,尤其是在商城类的项目当中,一般都会提供很强大的搜索功能,App的搜索布局一般都是在App的顶部,如下 ...

  2. jspscriptlet标签

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  3. [VC]WindowProc和DefWindowProc函数

    在Windows操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息,然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消 息.在API里定义了一个函数为回调函数,当系统需要向窗 ...

  4. 2015 ACM/ICPC Asia Regional Changchun Online Pro 1008 Elven Postman (BIT,dfs)

    Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  5. MySQL8 Authentication plugin 'caching_sha2_password' cannot be loaded

    这是因为mysql8 和以前密码的验证方式不同,可以先从命令行进入     MySQL  -uroot -p       然后输入 ALTER USER 'root'@'localhost' IDEN ...

  6. 一个.java文件内只能写一个class吗

    先给结论:当然不是!! 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件中可以不含public类,如果只有一个非public类,此时可以跟文件名不同. 为 ...

  7. Mac格式化fat32格式

    好的,格式化硬盘可以使用电脑内置的磁盘工具来格式. 在 LaunchPad 中的 实用工具 或 其它 找到 磁盘工具 打开磁盘工具后,找到你的移动硬盘. (这里以我的希捷移动盘来示例) 非常容易找到, ...

  8. CPP-网络/通信:SSL功能和原理

    面对诸多的网上交易的风险,很多网上银行.网上商城在建立系统时都注意到了安全问题.而我们也经常可以看到很多网上银行.电子商务网站在强调本系统的安全性的时候,都说采用了基于数字证书的SSL加密传输.SSL ...

  9. fiddler 模拟发送post请求

    打开fiddler,选择在右边的Composer工具栏,打开Parsed选项,然后数据发送协议,例如选择POST, POST右边输入框可以输入访问地址, 下方的输入框可以输入发送的输入操作,例如发送的 ...

  10. 解决升级mac os X EI Capitan后遇到LibclangError: dlopen(libclang.dylib, 6): image not found.的问题

    打开文件./frameworks/cocos2d-x/tools/bindings-generator/clang/cindex.py 把第 3395 行 改为 : library = cdll.Lo ...