在PHP中如何使用消息列队

时间:2022-08-29 19:57:27
/**
* 消息列队服务
* @author zhou.tingze
* @example
* -----------------------------------Create----------------------------------------
* $array = array('a','b','c','d');
* $this->load->library('amqp_service');
* $this->amqp_service->setSaveType('test_exchange', 'test_queue', 'test_router');
* $this->amqp_service->createMessageQueue($array);
* -----------------------------------End-------------------------------------------
*
* -----------------------------------Get-------------------------------------------
* $this->load->library('amqp_service');
* $this->amqp_service->setSaveType('test_exchange', 'test_queue', 'test_router');
* $message_queue = $this->amqp_service->getMessageQueue();
* var_dump($message_queue)
* -----------------------------------End-------------------------------------------
*/ class Amqp_service extends Base_service{ public $conn;
public $exchange;
public $queue;
public $router; function __construct(){
parent:: __construct(); //获取系统配置
$this->load->config('app_config', TRUE);
$app_config = $this->config->item('app_config'); $this->connect($app_config['amqp']);
} /**
*
* 尝试连接Amqp服务
*/
private function connect($amqp_args)
{
$this->conn = new AMQPConnection($amqp_args);
$this->conn->connect(); if (!$this->conn->isConnected())
{
throw new Exception('Cannot connect to the broker.');
}
} /**
*
* 设定消息列队保存方式
* @param String $exchange_name 交换机名
* @param String $queue_name 消息列队名
* @param String $router_name 路由名
*/
public function setSaveType($exchange_name, $queue_name, $router_name)
{
$this->exchange = $exchange_name;
$this->queue = $queue_name;
$this->router = $router_name;
} /**
*
* 创建消息列队
* @param Array $array
*/
public function createMessageQueue($array)
{
//创建交换机
$channel = new AMQPChannel($this->conn);
$ex = new AMQPExchange($channel); //交换机名
$ex->setName($this->exchange);
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
$ex->declare(); //创建消息列队
$q = new AMQPQueue($channel); //队列名
$q->setName($this->queue);
$q->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
$q->declare(); //绑定交换机与队列,并指定路由键
$q->bind($this->exchange, $this->router); //消息发布
$channel->startTransaction();
$message = json_encode($array);
$ex->publish($message, $this->router);
$channel->commitTransaction(); //$this->conn->disconnect();
} /**
*
* 获取消息列队
*/
public function getMessageQueue()
{
try
{
//设置queue名称,使用exchange,绑定routingkey
$channel = new AMQPChannel($this->conn);
$q = new AMQPQueue($channel); $q->setName($this->queue);
$q->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
$q->declare();
$q->bind($this->exchange, $this->router); //消息获取
$messages = $q->get(AMQP_AUTOACK) ; $arr = array();
if ($messages){
$arr = json_decode($messages->getBody(), true );
}
}catch (Exception $e){
throw new Exception($e->getMessage());
}
//$this->conn->disconnect(); return $arr;
} /*
public function getAllMessageQueue()
{
//设置queue名称,使用exchange,绑定routingkey
$channel = new AMQPChannel($this->conn);
$q = new AMQPQueue($channel); $q->setName($this->queue);
$q->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
$q->declare();
$q->bind($this->exchange, $this->router);
$this->conn->disconnect(); //阻塞模式获取消息列队
while(True){
$q->consume('processMessage');
//$q->consume('processMessage', AMQP_AUTOACK); //自动ACK应答
}
}
*/ public function __destruct()
{
$this->conn->disconnect();
}
} /**
* 消费回调函数
* 处理消息
* @param Object $envelope
* @param Object $queue
*/
/*
function processMessage($envelope, $queue) {
$msg = $envelope->getBody();
echo $msg . '<br />'; //手动发送ACK应答
$queue->ack($envelope->getDeliveryTag());
}
*/

  

在PHP中如何使用消息列队的更多相关文章

  1. C&num;操作消息列队

    首先安装消息队列MSMQ,在“计算机管理-服务和应用程序-消息队列-专用队列”中新建列队名称Demo: static void SendAndReceiveMsg() { MessageQueue m ...

  2. 消息列队 php 基于redis 实现

    说明 消息列队 基于PHP 实现. 之前 用python 的 flower 实现了 列队. 今天这里我们用的是 PHP 来实现: 在实际的业务环境中 PHP 用的多些: PHP 实现列队 最重要的是用 ...

  3. 消息列队 分布式事务解办法 celery flower使用总结

    前言 项目中有场景 需要用到 分布式事务业务,经过查下资料把学习相关笔记做记录方便他人或者自己后面查看. 场景 在网站A业务中有个操作 是 要在网站B中新建一台服务器跑业务.A中执行B中的接口创建服务 ...

  4. ZeroMQ接口函数之 :zmq&lowbar;msg&lowbar;recv - 从一个socket中接受一个消息帧

    ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq_msg_recv zmq_msg_recv(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ ...

  5. 在WPF中处理Windows消息

    在Winform中 处理Windows消息通过重写WndProc方法 在WPF中 使用的是System.Windows. Sytem.Windows.Controls等名字空间,没有WndProc函数 ...

  6. 如何在项目中引入MetaQ消息收发机制

    当需要异步发送和接收大量消息时,需要在Crystal项目中引入MetaQ消息收发机制. 关于MetaQ使用的官方例子可参考:https://github.com/killme2008/Metamorp ...

  7. 微信小程序中发送模版消息注意事项

    在微信小程序中发送模版消息 参考微信公众平台Api文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html#模版消息管理 此参考地址 ...

  8. spring拦截器中修改响应消息头

    问题描述 前后端分离的项目,前端使用Vue,后端使用Spring MVC. 显然,需要解决浏览器跨域访问数据限制的问题,在此使用CROS协议解决. 由于该项目我在中期加入的,主要负责集成shiro框架 ...

  9. 即时通信系统中实现聊天消息加密,让通信更安全【低调赠送:C&num;开源即时通讯系统(支持广域网)——GGTalk4&period;5 最新源码】

    在即时通讯系统(IM)中,加密重要的通信消息,是一个常见的需求.尤其在一些*部门的即时通信软件中(如税务系统),对即时聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新 ...

随机推荐

  1. ubuntu 终端快捷键

    快捷键 功能Tab 自动补全Ctrl+a 光标移动到开始位置Ctrl+e 光标移动到最末尾Ctrl+k 删除此处至末尾的所有内容Ctrl+u 删除此处至开始的所有内容Ctrl+d 删除当前字符Ctrl ...

  2. aspose&period;word 查找文本并加下划线

    private Run SplitRun(Run run, int position) { Run beforeRun = (Run)run.Clone(true); beforeRun.Text = ...

  3. lnmp停用nginx,改用apache

    编译安装的lnmp环境 总是出现502错误,修改了各种配置也没用,暂时先放弃nginx,改用apache apache使用yum安装方式 需要注意的事项,将网站根目录的用户组改为 chown apac ...

  4. iOS 第三方库冲突的处理

    最近项目组在做一些第三方功能的集成,不止一次的遇到第三方库冲突的问题,报错如下: duplicate symbol _OBJC_METACLASS_$_JKSerializer in: /Users/ ...

  5. Spring整合Struts2&comma;Hibernate的xml方式

    作为一个学习中的码农,一直学习才是我们的常态,所以最近学习了SSH(Spring,Struts2,Hibernate)整合,数据库用的MySQL. 写了一个简单的例子,用的工具是IntelliJ Id ...

  6. JQgrid表格的使用

    html部分: <div class="tab"> <table id="datatable"></table>      ...

  7. 如何使用JMeter开源性能测试工具来构建Web性能测试体系

    一.性能测试一些概念 性能测试:就是通过自动化的测试工具模拟多种正常峰值及异常负载条件来对系统的各项性能指标进行测试.负载测试和压力测试都属于性能测试,两者可以结合进行. 负载测试:确定在各种工作负载 ...

  8. Liunx Mkdir

    linux mkdir命令: 创建目录 介绍:该命令创建指定的目录名,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录1语法: mkdir [-m] [-p] 目录 ...

  9. ASP&period;NET开发常用简单实用的方法

    ASP.NET开发简单实用的方法 一.打印和导出 打印和导出EXCEL在目前ASP.NET开发中可以说是必要的,有时候针对不同数据难易程度下,用有效快速的方法是解决办法的有效途径之一. 1.打印 后台 ...

  10. Enterprise Library 4&period;1 参考源码索引

    http://www.projky.com/entlib/4.1/Microsoft/Practices/EnterpriseLibrary/AppSettings/Configuration/Des ...