php 事务处理,ActiveMQ的发送消息,与处理消息

本文介绍如何使用 PHP 和 ActiveMQ 实现事务型业务逻辑处理,通过链式发送-处理-发送的方式实现用户注册、优惠券赠送等业务流程。文章提供了具体的代码示例,包括发送注册消息、处理注册消息并发送后续任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以通过链式发送->处理->发送。。。的方式处理类似事务型业务逻辑

 

比如 发送一个注册消息,消息队列处理完注册以后,紧接着发送一个新手优惠券赠送,赠送完再发一个其它后续逻辑处理的消息等待后续队列处理

 

 

php ActiveMQ的发送消息,与处理消息

我们以一个简单的用户注册为例,当用户点击注册按钮后,我们发送一个消息,后台php接收到该消息然后处理。

1.php代码如下:

1
2
3
4
5
6
7
8
9
<?php
$stomp  new  Stomp( 'tcp://192.168.1.222:61613' );
 
$obj  new  Stdclass();
//下面这些数据,实际中是用户通过前端页面post来的,这里只做演示
$obj ->username =  'test' ;
$obj ->password =  '123456' ;
//发送一个注册消息到队列,我们这里模拟用户注册
$stomp ->send( '/queue/userReg' , json_encode( $obj ));

2.php代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$stomp  new  Stomp( 'tcp://192.168.1.222:61613' );
//订阅只对一个有效,如果启动多个脚本,只有一个会接收到消息
$stomp ->subscribe( '/queue/userReg' );
 
while (true) {
     //判断是否有读取的信息
     if ( $stomp ->hasFrame()) {
         $frame  $stomp ->readFrame();
 
         $data  = json_decode( $frame ->body, true);
         var_dump( $data );
 
         //我们通过获取的数据
         //处理相应的逻辑,比如存入数据库,发送验证码等一系列操作。
         //$db->query("insert into user values('{$username}','{$password}')");
         //sendVerify();
 
         //表示消息被处理掉了,ack()函数很重要
         $stomp ->ack( $frame );
     }
     sleep(1);
}

分别运行上面两个脚本文件

1
2
> /data/php56/bin/php 1.php
> /data/php56/bin/php 2.php

我们还可以把上面的2.php代码分成多步执行。

2.php代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$stomp  new  Stomp( 'tcp://192.168.1.222:61613' );
$stomp ->subscribe( '/queue/userReg' );
 
while (true) {
     //判断是否有读取的信息
     if ( $stomp ->hasFrame()) {
         $frame  $stomp ->readFrame();
 
         $data  = json_decode( $frame ->body, true);
 
         //注册信息入库
         //$ret = db->query("insert into user values('{$data['username']}', '{$data['password']}')");
         //这里演示直接设成true了
         $ret  = true;
         if ( $ret ) {
             echo  $data [ 'username' ],  '入库成功' , PHP_EOL;
             //如果入库成功,再次把数据发送到另一个消息队列中,进行下一步处理
             $stomp ->send( '/queue/sendVerify' $frame ->body);
 
             $stomp ->ack( $frame );
         }
     }
     sleep(1);
}

3.php代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$stomp  new  Stomp( 'tcp://192.168.1.222:61613' );
$stomp ->subscribe( '/queue/sendVerify' );
 
while (true) {
     //判断是否有读取的信息
     if ( $stomp ->hasFrame()) {
         $frame  $stomp ->readFrame();
 
         $data  = json_decode( $frame ->body, true);
 
         //$ret = sendVerify()发送验证码,实际中应该是请求某接口
         $ret  = true;
         if ( $ret ) {
             echo  $data [ 'username' ],  '发送验证码成功' , PHP_EOL;
 
             $stomp ->ack( $frame );
         }
     }
     sleep(1);
}

再次分别运行上面的三个脚本

1
2
3
> /data/php56/bin/php 1.php
> /data/php56/bin/php 2.php
> /data/php56/bin/php 3.php

转载于:https://www.cnblogs.com/dasn/p/8581106.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值