**RABBITMQ**
1、交换机
~~~
// @param1:名称
// @param2:类型,默认:direct
// @param3:是否创建为延迟交换机,默认:FALSE
// @param4:当交换机不存在时不自动创建,默认:FALSE
// @param5:持久化,默认:TRUE
// @param6:连接断开后自动删除交换机,默认:FALSE
$Rmq = \api\Rmq::exchange('exchange');
// 以上参数一般情况下默认即可
~~~
2、队列
~~~
// @param1:名称
// @param2:当队列不存在时不自动创建,默认:FALSE
// @param3:持久化,默认:TRUE
// @param4:队列允许其他通道消费,默认:FALSE
// @param5:队列执行完毕后自动删除,默认:FALSE
\api\Rmq::queue('queue');
// 以上参数一般情况下默认即可
~~~
3、将队列绑定到交换机
~~~
// @param1:路由,默认:空
\api\Rmq::bind();
~~~
4、添加队列
~~~
// @param1:写入的内容,字符串或者数组格式
// @param2:是否批量写入,默认:FALSE
// @param3:延迟写入,默认:FALSE
$Rmq->add([
'txt' => 'content'
]);
// 如果第二个参数是FALSE(不是批量写入的情况下),到此就已经将数据写入到队列
~~~
5、执行批量写入队列
~~~
for ($i = 1; $i < 1001; $i++)
$Rmq->add([
'txt' => $i
], TRUE);
// 批量写入
$Rmq->publish();
~~~
6、消费队列
~~~
// @param1:消费回调,在此处理自己的业务,默认会传递一个$msg参数,里面包含该条队列的详细信息
// @param2:自动应答,默认:FALSE
// @param3:标签,默认:''
$Rmq->consume(function($msg){
// 手动应答,告诉rabbitmq已经处理了该条队列
// 如果第二个参数为TRUE,则此行代码可以不写
// 手工应答的可靠度更高一些
\api\Rmq::ack($msg);
echo $msg->body;
});
~~~
7、读取单条队列
~~~
$msg = $Rmq->get();
~~~
---
**完整示例**
1、普通队列写入
~~~
$Rmq = \api\Rmq::exchange('demo')
->queue('demo_queue')
->bind();
$Rmq->add([
'txt' => 'content'
]);
// 简化写法
rmq('demo', 'demo_queue')->add([
'txt' => 'content'
]);
// 在项目配置文件 Rmq.php中可以配置默认的 交换机和队列,采用默认配置可以使用一下写法
rmq()->add([
'txt' => 'content'
]);
~~~
2、批量写入队列
~~~
$Rmq = \api\Rmq::exchange('demo')
->queue('demo_queue')
->bind();
$Rmq->add([
'txt' => 'content'
], TRUE);
$Rmq->publish();
// 简化写法
$rmq = rmq();
$rmq->add([
'txt' => 'content'
], TRUE);
$rmq->publish();
~~~
3、延迟写入队列
>延迟队列使用场景:
>
>新用户使用1天这种功能,可以在开通后写入一个延迟1天的队列,1天后消费端消费到这条队列,把该用户的授权信息删除
~~~
$Rmq = \api\Rmq::exchange(
'delayed',
'direct',
TRUE
)->queue('demo_queue')->bind();
// 延迟半小时写入队列
$Rmq->add([
'txt' => 'content'
], FALSE, 3600);
~~~
4、普通消费
~~~
$Rmq = \api\Rmq::exchange('demo')->queue('demo_queue')->bind();
$Rmq->consume(function($msg){
// 手工应答
\api\Rmq::ack($msg);
$data = $message->body;
$data = json_decode($data, TRUE);
// 下面处理自己的业务逻辑
......
});
~~~
5、消费后自动应答
~~~
$Rmq = \api\Rmq::exchange('demo')->queue('demo_queue')->bind();
$Rmq->consume(function($msg){
$data = $message->body;
$data = json_decode($data, TRUE);
// 下面处理自己的业务逻辑
......
}, TRUE);
~~~