PHP基于rabbitmq操作类的生产者和消费者功能示例


Posted in PHP onJune 16, 2018

本文实例讲述了PHP基于rabbitmq操作类的生产者和消费者功能。分享给大家供大家参考,具体如下:

注意事项:

1、accept.php消费者代码需要在命令行执行

2、'username'=>'asdf','password'=>'123456' 改成自己的帐号和密码

RabbitMQCommand.php操作类代码

<?php
/*
 * amqp协议操作类,可以访问rabbitMQ
 * 需先安装php_amqp扩展
 */
class RabbitMQCommand{
  public $configs = array();
  //交换机名称
  public $exchange_name = '';
  //队列名称
  public $queue_name = '';
  //路由名称
  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 $autodelete = False;
  /*
   * 镜像
   * 镜像队列,打开后消息会在节点之间复制,有master和slave的概念
   */
  public $mirror = False;
  private $_conn = Null;
  private $_exchange = Null;
  private $_channel = Null;
  private $_queue = Null;
  /*
   * @configs array('host'=>$host,'port'=>5672,'username'=>$username,'password'=>$password,'vhost'=>'/')
   */
  public function __construct($configs = array(), $exchange_name = '', $queue_name = '', $route_key = '') {
    $this->setConfigs($configs);
    $this->exchange_name = $exchange_name;
    $this->queue_name = $queue_name;
    $this->route_key = $route_key;
  }
  private function setConfigs($configs) {
    if (!is_array($configs)) {
      throw new Exception('configs 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 exchange_name or queue_name or route_key is empty',500);
    }
    $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()));
}
exit();

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();
    $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);

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
BBS(php &amp; mysql)完整版(三)
Oct 09 PHP
PHP 危险函数解释 分析
Apr 22 PHP
PHP 编程安全性小结
Jan 08 PHP
用C/C++扩展你的PHP 为你的php增加功能
Sep 06 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
Jun 21 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
PHP页面输出搜索后跳转下一页的处理方法
Sep 30 PHP
PHP版微信小店接口开发实例
Nov 12 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
PHP 实现 JSON 数据的编码和解码操作详解
Apr 22 PHP
深入分析PHP设计模式
Jun 15 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 #PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 #PHP
PHP堆栈调试操作简单示例
Jun 15 #PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 #PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 #PHP
基于swoole实现多人聊天室
Jun 14 #PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 #PHP
You might like
关于PHP堆栈与列队的学习
2013/06/21 PHP
php生成excel列序号代码实例
2013/12/24 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
详解Vue的七种传值方式
2021/02/08 Vue.js
[22:20]初生之犊-TI4第5名LGD战队纪录片
2014/08/13 DOTA
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
举例简单讲解Python中的数据存储模块shelve的用法
2016/03/03 Python
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
2020/01/08 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
Django之腾讯云短信的实现
2020/06/12 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
神路信息Java面试题目
2013/03/31 面试题
个人委托书格式
2014/04/04 职场文书
社区工作者演讲稿
2014/05/23 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
Python基础知识之变量的详解
2021/04/14 Python