PHP使用ActiveMQ实现消息队列的方法详解


Posted in PHP onMay 31, 2019

本文实例讲述了PHP使用ActiveMQ实现消息队列的方法。分享给大家供大家参考,具体如下:

前面我们已经学了如何部署ActiveMQ,
我们知道通过ActiveMQ的一个管理后台可以查看任务队列。

今天

PHP使用ActiveMQ实现消息队列的方法详解
用PHP来操作ActiveMQ,我们可以借助一个第三方扩展。
下载:

composer require fusesource/stomp-php:2.0.*

然后新建test.php:

<?php

require __DIR__.'/vendor/autoload.php'; //引入自动加载的文件

$connect = new \FuseSource\Stomp\Stomp('tcp://10.211.55.13/:61613');
$connect->connect();

$userId = 1001;
$result = $connect->send('email',$userId); //比如发邮件
var_dump($result);

PHP使用ActiveMQ实现消息队列的方法详解
发送消息成功,打印bool(true)

我们在ActiveMQ自带的管理后台查看,确实有一个名为”email”的队列。
PHP使用ActiveMQ实现消息队列的方法详解

上面我们发送的一个id,我们还可以发送json数据。

$data = array('id'=>1001,'email'=>'110@qq.com','content'=>'test');
$result = $connect->send('email',json_encode($data));

我们在MQ后台可以查看消息详细
PHP使用ActiveMQ实现消息队列的方法详解

上面的代码到这里,还不够完美。如果我们服务器重启了activemq,没有处理的消息会丢失。
这个时候我们需要用到send()方法的第三个参数。

//消息持久化 persistent为true,字符串的'true'
$result = $connect->send('email',json_encode($data),array('persistent'=>'true'));

前面我们完成了『发送』

给mq服务器发送消息(email消息)。
那么在mq的队列中的任务,又是怎么处理的呢?

<?php

require __DIR__.'/vendor/autoload.php'; //引入自动加载的文件

$connect = new \FuseSource\Stomp\Stomp('tcp://10.211.55.13/:61613');
$connect->connect();

//订阅队列消息
$connect->subscribe('email');

if ($connect->hasFrameToRead()){
  $frame = $connect->readFrame();
  print_r($frame);
}

在mq服务端,订阅(监听)队列消息。
在服务端是命令行下执行:php mqServer.php
如果有没有处理的消息,可以读取出来,打印结果如下:

FuseSource\Stomp\Frame Object
(
  [command] => MESSAGE
  [headers] => Array
    (
      [expires] => 0
      [destination] => /queue/email
      [priority] => 4
      [message-id] => ID:localhost.localdomain-38488-1488196907415-3:2:-1:1:1
      [timestamp] => 1489477647931
    )

  [body] => {"id":1001,"email":"110@qq.com","content":"test"}
)

body就把我们发送的内容读取出来了。

我们循环读取(死循环)一直等待新消息:

do{
  if ($connect->hasFrameToRead()){
    $frame = $connect->readFrame();
    print_r($frame->body);
  }
} while (true);

处理消息之后(在发送邮件等业务完成之后),要通知mq我处理了该条消息了

if ($connect->hasFrameToRead()){
    $frame = $connect->readFrame();
    //print_r($frame->body);

    //做业务逻辑
    //具体发送邮件的业务
    //send email

    //最后通知mq,我们已经处理了该条消息
    $connect->ack($frame);
  }

我们还可以在优化一下代码,解决死循环,控制循环(这里是一种方案演示)

do{
  //会等待,直到有可用消息,才执行后面代码
  if ($connect->hasFrameToRead()){
    $frame = $connect->readFrame();
    //print_r($frame->body);

    //做业务逻辑
    //具体发送邮件的业务
    //send email
    sleep(2); //模拟延时

    //最后通知mq,我们已经处理了该条消息
    $connect->ack($frame);
  }

  //控制循环
  $next = true;
  if (file_exists(__DIR__.'/stop')){
    //如果有名为stop的一个文件
    //就不循环了
    $next = false;
  }
} while ($next);

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

PHP 相关文章推荐
PHP无限分类的类
Jan 02 PHP
mysql+php分页类(已测)
Mar 31 PHP
PHP 读取文件内容代码(txt,js等)
Dec 06 PHP
浅谈apache和nginx的rewrite的区别
Feb 22 PHP
php创建基本身份认证站点的方法详解
Jun 08 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
Yii框架组件和事件行为管理详解
May 20 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
Mar 31 PHP
PHP fclose函数用法总结
Feb 15 PHP
PHP+jQuery实现双击修改table表格功能示例
Feb 21 PHP
laravel框架语言包拓展实现方法分析
Nov 22 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 PHP
php中的buffer缓冲区用法分析
May 31 #PHP
PHP实现基于状态的责任链审批模式详解
May 31 #PHP
Laravel框架实现调用百度翻译API功能示例
May 30 #PHP
Laravel框架学习笔记之批量更新数据功能
May 30 #PHP
PHP实现的微信公众号扫码模拟登录功能示例
May 30 #PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 #PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
May 29 #PHP
You might like
php读取javascript设置的cookies的代码
2010/04/12 PHP
PHP垃圾回收机制引用计数器概念分析
2013/06/24 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
php程序内部post数据的方法
2015/03/31 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
微信小程序 解析网页内容详解及实例
2017/02/22 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
深入了解js原型模式
2019/05/30 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
从零学Python之入门(三)序列
2014/05/25 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
Python中%r和%s的详解及区别
2017/03/16 Python
Python 关于反射和类的特殊成员方法
2017/09/14 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
工程管理专业毕业生自荐信
2014/01/24 职场文书
餐厅经理岗位职责范本
2014/02/17 职场文书
进口业务员岗位职责
2014/04/06 职场文书
爱心倡议书范文
2014/05/12 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技