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 相关文章推荐
实用函数4
Nov 08 PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 PHP
PHP的简易冒泡法代码分享
Aug 28 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
解析php中两种缩放图片的函数,为图片添加水印
Jun 14 PHP
php获取随机数组列表的方法
Nov 13 PHP
PHP动态生成指定大小随机图片的方法
Mar 25 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
php调用自己java程序的方法详解
May 13 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
php写入txt乱码的解决方法
Sep 17 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 strncasecmp字符串比较的小技巧
2011/01/04 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
javascript prototype原型操作笔记
2009/12/07 Javascript
jquery获取input的value问题说明
2010/08/19 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
javascript冒泡排序小结
2016/04/10 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
Vue如何实现监听组件原生事件
2020/07/03 Javascript
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
python跨文件使用全局变量的实现
2020/11/17 Python
python实现文件分片上传的接口自动化
2020/11/19 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
十佳大学生事迹材料
2014/01/29 职场文书
药品业务员岗位职责
2014/04/17 职场文书
学习演讲稿范文
2014/05/10 职场文书
禁烟标语大全
2014/06/11 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
五一劳动节慰问信
2015/02/14 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
2021/06/04 Oracle