PHP+RabbitMq示例展示
来源:互联网 发布:php bbs论坛源码下载 编辑:程序博客网 时间:2024/06/05 01:18
注意事项:
1、accept.PHP消费者代码需要在命令行执行
RabbitMQCommand.php操作类代码
<?php/* * amqp协议操作类,可以访问rabbitMQ * 需先安装php_amqp扩展 */ class RabbitMQCommand{ public $configs=array(); //交换机名称 public $exchange_name=''; //队列名称 public $queue_name=''; //路由名称 public $route_key=''; //持久化 public $durable=True; /* * 自动删除 * exchange is deleted when all queues have finished using it * queue is deleted when last consumer unsubscribes * */ public $autodelete = False; /* * 镜像 * 镜像队列,打开后消息会在节点之间复制,有master和slave的概念 */ public $mirror = False; private $_conn = Null; private $_exchange = Null; private $_channel = Null; private $_queue = Null; public function __construct($configs=array(),$exchange_name='',$queue_name='',$route_key=''){ $this->setConfig($configs); $this->exchange_name=$exchange_name; $this->queue_name=$queue_name; $this->route_key=$route_key; } private function setConfig($configs){ if(!is_array($configs)){ throw new Exception('config is not array'); } if(!($configs['host'] && $configs['port'] && $configs['username'] && $configs['password'])){ throw new Exception('configs is empty'); } if(empty($configs['vhost'])){ $configs['vhost']='/'; } $configs['login']=$configs['username']; unset($configs['username']); $this->configs=$configs; } /* * 设置是否持久化,默认为True */ public function setDurable($durable){ $this->durable=$durable; } /* * 设置是否自动删除 */ public function setAutoDelete($autodelete){ $this->autodelete=$autodelete; } /* * 设置是否镜像 */ public function setMirror($mirror){ $this->mirror=$mirror; } /* * 打开amqp连接 */ private function open(){ if(!$this->_conn){ try { $this->_conn=new AMQPConnection($this->configs); $this->_conn->connect(); $this->initConnection(); } catch (AMQPConnectionException $ex) { throw new Exception('cannot connection rabbitmq',500); } } } /* * rabbitmq连接不变 * 重置交换机,队列,路由等配置 */ public function reset($exchange_name,$queue_name,$route_key){ $this->exchange_name=$exchange_name; $this->queue_name=$queue_name; $this->route_key=$route_key; $this->initConnection(); } /* * 初始化rabbit连接的相关配置 */ private function initConnection(){ if(empty($this->exchange_name) || empty($this->queue_name) || empty($this->route_key)){ throw new Exception('rabbitmq exhange_name or queue_name or route_key is empty',500); } //连接channel $this->_channel=new AMQPChannel($this->_conn); //创建交换机 $this->_exchange=new AMQPExchange($this->_channel); $this->_exchange->setName($this->exchange_name); $this->_exchange->setType(AMQP_EX_TYPE_DIRECT); if($this->durable){ $this->_exchange->setFlags(AMQP_DURABLE); } if($this->autodelete){ $this->_exchange->setFlags(AMQP_AUTODELETE); } $this->_exchange->declare(); //创建队列 $this->_queue=new AMQPQueue($this->_channel); $this->_queue->setName($this->queue_name); if($this->durable){ $this->_queue->setFlags(AMQP_DURABLE); } if($this->autodelete){ $this->_queue->setFlags(AMQP_AUTODELETE); } if($this->mirror){ $this->_queue->setArgument('x-ha-policy','all'); } $this->_queue->declare(); //将队列通过制定路由绑定到指定交换机上 $this->_queue->bind($this->exchange_name,$this->route_key); } public function close(){ if($this->_conn){ $this->_conn->disconnect(); } } public function __sleep(){ $this->close(); return array_keys(get_object_vars($this)); } public function __destruct(){ $this->close(); } /* * 生产者发送消息 */ public function send($msg) { $this->open(); if(is_array($msg)){ $msg = json_encode($msg); }else{ $msg = trim(strval($msg)); } return $this->_exchange->publish($msg, $this->route_key); } /* * 消费者 * $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($fun_name,$autoack=True){ $this->open(); if(!$fun_name || !$this->_queue) return false; while(True){ if($autoack) $this->_queue->consume($fun_name,AMQP_AUTOACK); else $this->_queue->consume($fun_name); } }}
send.php生产者代码
<?php set_time_limit(0); include_once('RabbitMQCommand.php'); $configs = array('host'=>'127.0.0.1','port'=>5672,'username'=>'asdf','password'=>'123456','vhost'=>'/'); $exchange_name = 'class-e-1'; $queue_name = 'class-q-1'; $route_key = 'class-r-1'; $ra = new RabbitMQCommand($configs,$exchange_name,$queue_name,$route_key); for($i=0;$i<=100;$i++){ $ra->send(date('Y-m-d H:i:s',time())); }
accept.php消费者代码
<?php error_reporting(0); include_once('RabbitMQCommand.php'); $configs = array('host'=>'127.0.0.1','port'=>5672,'username'=>'asdf','password'=>'123456','vhost'=>'/'); $exchange_name = 'class-e-1'; $queue_name = 'class-q-1'; $route_key = 'class-r-1'; $ra = new RabbitMQCommand($configs,$exchange_name,$queue_name,$route_key); class A{ function processMessage($envelope, $queue) { $msg = $envelope->getBody(); //自增id $envelopeID = $envelope->getDeliveryTag(); $pid = posix_getpid(); //将取出来的内容放到文件里面 file_put_contents("log{$pid}.log", $msg.'|'.$envelopeID.''."\r\n",FILE_APPEND); $queue->ack($envelopeID); } } $a = new A(); $s = $ra->run(array($a,'processMessage'),false);
消息队列的实现中,RabbitMQ以其健壮和可靠见长.公司的项目中选择了它作为消息队列的实现.关于MQ的机制和原理网上有很多文章可以看,这里就不再赘述,只讲几个比较容易混淆的问题
1,binding key和routing key
binding key和routing key是都不过是自己设置的一组字符,只是用的地方不同,binding key是在绑定交换机和队列时候通过方法传递的字符串,routing key是在发布消息时候,顺便带上的字符串,有些人说这两个其实是一个东西,也对也不对,说对,是因为这两个可以完全一样,说不对,是因为这两个起的作用不同,一个交换机可以绑定很多队列,但是每个队列也许需要的消息类型不同,binding key就是这个绑定时候留在交换机和队列之间的提示信息,当消息发送出来后,随着消息一起发送的routing key如果和binding key一样就说明消息是这个队列要的东西,如果不一样那就不要给这个队列,交换机你找找下个队列看看要不要.明白了吧,这两个key就是暗号,对上了就是自己人,对不上那麻烦你再找找去.
2,持久化
交换机和队列都可以在创建时候设置为持久化,重启以后会回复,但是其中的消息未不会,如果要消息也恢复,将消息发布到交换机的时候,可以指定一个标志“Delivery Mode”(投递模式), 1为非持久化,2为持久化.
3,流控机制
当消息生产的速度更快,而进程的处理能力低时,消息就会堆积起来,占用内存越来越多,导致MQ崩溃,所以rabbitmq有一个流控机制,当超过限定时候就会阻止接受消息,mq流控有三种机制
1,主动阻塞住发消息太快的连接,这个无法调整,如果被阻塞了,在abbitmqctl 控制台上会显示一个blocked的状态。
2,内存超过限量,会阻塞连接,在vm_memory_high_watermark可调
3,剩余磁盘在限定以下mq会 主动阻塞所有的生产者,默认为50m,在disk_free_limit可调.
- PHP+RabbitMq示例展示
- rabbitmq PHP代码示例
- php rabbitmq延迟队列示例
- PHP rabbitmq
- rabbitmq php
- RabbitMQ的项目示例
- RabbitMQ工作队列示例
- java 使用RabbitMQ示例
- RabbitMQ hello world示例
- JAVA-RabbitMQ使用示例
- vue各种示例展示
- Rabbitmq 概述及代码示例
- RabbitMQ官网示例分析
- springboot+rabbitmq整合示例程
- Spring整合RabbitMQ简单示例
- springboot+rabbitmq整合示例程
- php RabbitMQ消息队列
- rabbitmq php tutorial -1
- java 初始化加载
- Linux环境下在Tomcat上部署JavaWeb工程
- Linux安装ElasticSearch启动报错
- code 队友博客
- iOS动画进阶
- PHP+RabbitMq示例展示
- c++ vector初始化总结
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? (基础c++)
- 中英文对照 —— 英语语法与文法概念
- ExpressBox 2400
- 使用listView事件实现上拉加载
- perl 根据div 标签 查找id属性的值
- for循环记数器
- C# Dictionary 字典简介