08/12
2017
dev-master
9999999-dev通过rabbit 创建消费者,生产者
Apache-2.0
The Requires
- yiisoft/yii2 *
- php ^7.0
by 沈博然
extension yii2
Wallogit.com
2017 © Pedro Peláez
通过rabbit 创建消费者,生产者
非常方便使用rabbitMQ队列(其实只要amqp支持的都可以),使用yii2框架, (*1)
在项目文件composer.json 中加入, (*2)
"require" : {
....
"shenboran/yii2-rabbitmq" : "dev-master"
},
在params.php 文件中申明地址, (*3)
'rabbitMQ' => [
'host' => "127.0.0.1",
'port' => '5672',
'login' >= 'guest',
'password' => "guest",
'vhost' => "/"
]
<?php
namespace common\component\queue;
use common\utils\SmsUtil;
use shenboran\rabbitmq\RabbitQueue;
class SMSQueue extends RabbitQueue
{
/**
* 交换机名称 定义自己的交换机
*
* @var string
*/
protected $_exchangeName = 'exchange';
/**
* 队列名称
*
* @var string 定义你自己的队列名称
*/
protected $_queueName = 'q_sim';
/**
* 路由
*
* @var string 定义你自己的路由名称
*/
protected $_routeKey = 'sendmsg';
/**
* 路由
*
* @var string 定义你自己的交换机的转发类型 默认是AMQP_EX_TYPE_DIRECT
*/
protected $_exchangeType = AMQP_EX_TYPE_DIRECT;
public function __construct()
{
parent::__construct();
}
/**
* 实现抽象方法
* 用来处理队列元素的 逻辑
*/
public function proccess($envelope, $queue)
{
$msg = $envelope->getBody();
$result = json_decode($msg, true); //获取队列元素信息
if (YII_ENV_PROD) { // 真实环境采取发送短信
$result = SmsUtil::sendCode($result['m'], $result['v']);//自己的业务逻辑
if ($result) {
$queue->ack($envelope->getDeliveryTag());//手动发送ack 确认队列中的元素已经消耗掉了
}else{
//发送失败的逻辑
}
} else {
$queue->ack($envelope->getDeliveryTag());//手动发送ack 确认队列中的元素已经消耗掉了
}
}
}
在main.php 中注册下你的队列服务层, (*4)
<?php return [ 'components' => [ 'smsQueue' => [ 'class' => 'common\component\queue\SMSQueue' //一个用于发送短信的队列 ], 'wechatPMPQueue' => [ 'class' => 'common\component\queue\WechatPMPQueue' //一个用于发送微信模板推送的队列 ] ] ];
//支持 数组 和字符串 其实最后都转化成字符串了 $data=['m'=>'13888888888','v'=>'1234']; \Yii::$app->smsQueue->public($data); \Yii::$app->wechatPMPQueue->public($data);
// 默认情况下 不会自动确认队列元素是否消耗掉(推荐) \Yii::$app->smsQueue->consume(); // 自动发送ack 用来消耗队列中的元素 \Yii::$app->smsQueue->consume(true);
通过rabbit 创建消费者,生产者
Apache-2.0
extension yii2