PHP中使用ActiveMQ实现消息队列

前面我们已经学了如何部署ActiveMQ

我们知道通过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);

发送消息成功,打印bool(true)

我们在ActiveMQ自带的管理后台查看,确实有一个名为”email”的队列。

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

$data = array(‘id‘=>1001,‘email‘=>‘[email protected]‘,‘content‘=>‘test‘);
$result = $connect->send(‘email‘,json_encode($data)); 

我们在MQ后台可以查看消息详细

上面的代码到这里,还不够完美。如果我们服务器重启了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":"[email protected]","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);
时间: 2024-10-29 05:06:34

PHP中使用ActiveMQ实现消息队列的相关文章

zookeeper + LevelDB + ActiveMQ实现消息队列高可用

通过集群实现消息队列高可用. 消息队列在项目中存储订单.邮件通知.数据分发等重要信息,故对消息队列稳定可用性有高要求. 现在通过zookeeper选取activemq leader的形式实现当某个activemq节点出问题时,保证系统的可用性. zookeeper做为服务选取器来选择activemq作为master. 开发环境将zoopkeeper zoo_sample.cfg拷贝并修改文件名称为zoo.cfg. activemq 配置禁用kahadb启用LevelDB 其中 zkAddress

android 中使用View的消息队列api更新数据

基本上只要继承自View的控件,都具有消息队列或者handler的一些处理方法,下面是一些handler方法以及被View封装了的方法,其底层用的基本都是handler的api. 我么开一下postDelay的定义 android.view.View  public boolean postDelayed(Runnable action, long delayMillis) {         final AttachInfo attachInfo = mAttachInfo;         

redis中list模拟案例-消息队列

redis 数据类型:字符串string.list.set.zset.hash 主要的是list消息队列 消息队列的概念:先进先出 <?php//echo phpinfo();ini_set('display_errors','On');error_reporting(E_ALL);//连接本地的 Redis 服务$redis = new Redis();$redis->connect('127.0.0.1', 6379);print_r($redis);echo "<br/&

PHP中利用redis实现消息队列处理高并发请求

将请求存入redis 为了模拟多个用户的请求,使用一个for循环替代 //redis数据入队操作 $redis = new Redis(); $redis->connect('127.0.0.1',6379); for($i=0;$i<50;$i++){ try{ $redis->LPUSH('click',rand(1000,5000)); }catch(Exception $e){ echo $e->getMessage(); } } 在后台进行数据处理 守护进程 //redi

消息队列 ActiveMQ详解

一.首先,说一下ActiveMQ在Linux的安装: 1.下载安装包: 下载:apache-activemq-5.14.0-bin.tar.gz 地址:http://activemq.apache.org/activemq-5140-release.html 2.安装到Linux虚拟机上: 1.gz文件拷贝到/usr/local/src目录 2.解压启动: tar -zxvf apache-activemq-5.14.0-bin.tar.gz cd apache-activemq-5.14.0/

php中对共享内存,消息队列的操作

http://www.cnblogs.com/fengwei/archive/2012/09/12/2682646.html php作为脚本程序,通常生命周期都很短,如在web应用中,一次请求就是php运行的 一个周期,请求结束则生命周期截止.所以php在处理需要共 享的资源时,一般会将共享数据保存在数据库或dbm之类的文件中,再者就是利用内存实现共享.你可以选择已有的工具辅助你,像memcache:也可以自 己编写代码访问操作系统的共享内存段. php中对共享内存段的操作有两组函数:Syste

ZWave 中的消息队列机制

文章主题   在我们的日常编程中,对消息队列的需求非常常见,使用一个简洁.高效的消息队列编程模型,对于代码逻辑的清晰性,对于事件处理的高效率来说,是非常重要的.这篇文章就来看看 ZWave 中是通过什么机制为我们提供了一个便捷的消息队列处理机制. 内容导航   消息队列是什么 我自己写的消息队列 ZWave 消息队列的结构 ZWave 消息队列的使用(初始化.存储消息.取出消息) 消息队列是什么   消息队列最主要特点是:存储消息,先进先出. 比如在典型的生产者-消费者编程模型中,先创建一个消息

消息队列一览

谈谈互联网后端基础设施 http://www.rowkey.me/blog/2016/08/27/server-basic-tech-stack/ service之间的调用方式可以分为同步调用以及异步调用.异步调用是怎么进行的?一种很常见的方式就是使用消息队列,调用方把请求放到队列中即可返回,然后等待服务提供方去队列中去获取请求进行处理,然后把结果返回给调用方即可(可以通过回调). 异步调用就是消息中间件一个非常常见的应用场景.此外,消息队列的应用场景还有以下: 解耦:一个事务,只关心核心的流程

消息队列中间件的技术选型分析

[http://cloudate.net/?p=1165]2015/04/25  |  消息队列 |  罗伯特 消息队列中间件是互联网行业不可或缺的一项基本技术,在高并发消峰,非关键业务异步化,通知系统,监控数据推送等场景下是必不可少的,下文为转载文章,具体出处不详. 个人很喜欢ZeroMQ,非企业级的消息中间件,具有及低延迟-微秒级,使用简单灵活可嵌入等特性,性能报告请参考官网:http://zeromq.org/results:more-precise-0mq-tests 消息中间件是一种由