php订单模块解耦,PHP快速使用RabbitMQ实现项目中部分业务的解耦
PHP快速使用RabbitMQ實(shí)現(xiàn)項(xiàng)目中部分業(yè)務(wù)的解耦
步驟:
1.?Linux安裝完rabbitMQ后,沒(méi)有配置文件,需要去github(https://github.com/rabbitmq/rabbitmq-server/tree/master/docs)上將rabbitmq.conf.example復(fù)制下載下來(lái)改為rabbitmq.conf。
3.?進(jìn)入到管控臺(tái)后,先創(chuàng)建vhost,點(diǎn)擊admin,側(cè)欄框點(diǎn)擊Virtual Hosts。
4.?添加Exchanges,先選擇對(duì)應(yīng)的Vhost
6.?隊(duì)列添加完畢后選擇其中一個(gè)添加的名稱進(jìn)入。
8.?成功后就可以通過(guò)PHP代碼生產(chǎn)消息到該虛擬機(jī),然后經(jīng)過(guò)交換機(jī)路由到該隊(duì)列中。
namespace rabbitmq;
class Amq
{
/**
* @var object 對(duì)象實(shí)例
*/
protected static $instance;
protected $exchange="router_visit"; // 交換機(jī)(需要在隊(duì)列中綁定)
protected $queue ="visit_log"; // 隊(duì)列
protected $route ="router_visit"; // 路由key(需要在隊(duì)列中綁定)
protected $consumer_tag="consumer";
protected $config = [
"host" => "146.53.206.264",
"port" => 5672,
"login" => "guest",//guest
"password" => "guest",//Na18gR@9tf
"vhost" => "log",
"amqp_debug" => true
];
protected $exchange_index = 0;
protected $exchange_type = [
"direct",
"fanout",
"topic",
"headers"
];
/**
* @note 實(shí)例化
* @author: beiqiaosu
* @since: 2019/11/13 16:10
*/
public static function getInstance()
{
if (!(self::$instance instanceof self)) {
self::$instance = new self();
}
return self::$instance;
}
/**
* @Notes: 消息生產(chǎn)
*/
public function publisher($message,$config=[]) {
//如果有配置就用新配置
$this->config ["vhost"] = $config["vhost"]?? $this->config ["vhost"];
$this->exchange = $config["exchange"]?? $this->exchange;
$this->queue = $config["queue"]?? $this->queue;
$this->consumer_tag = $config["consumer_tag"]?? $this->consumer_tag;
$this->route = $config["route"]?? $this->route;
$this->exchange_index = $config["exchange_index"]?? $this->exchange_index;
$cnn = new AMQPConnection($this->config);
if (!$cnn->connect()) {
echo "Cannot connect to the broker";
exit();
}
$channel = new AMQPChannel($cnn);
$ex = new AMQPExchange($channel);
$ex->setName($this->exchange);
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct類型
$ex->setFlags(AMQP_DURABLE); //持久化
$ex->declareExchange();
return "Send Message:".$ex->publish($message, $this->route, AMQP_NOPARAM, array("delivery_mode" => 2))."
";
}
/**
* @note 消費(fèi)
* @author: tata
* @since: 2019/11/13 16:10
*/
public function consumer() {
$exchange="router_visit"; //交換機(jī)
$queue ="visit_log"; //隊(duì)列
$route ="router_visit"; //路由
//連接broker
$cnn = new AMQPConnection($this->config);
if (!$cnn->connect()) {
echo "Cannot connect to the broker";
exit();
}
$channel = new AMQPChannel($cnn);
$ex = new AMQPExchange($channel);
//設(shè)置交換機(jī)名稱
$ex->setName($exchange);
//設(shè)置交換機(jī)類型
//AMQP_EX_TYPE_DIRECT:直連交換機(jī)
//AMQP_EX_TYPE_FANOUT:扇形交換機(jī)
//AMQP_EX_TYPE_HEADERS:頭交換機(jī)
//AMQP_EX_TYPE_TOPIC:主題交換機(jī)
$ex->setType(AMQP_EX_TYPE_DIRECT);
//設(shè)置交換機(jī)持久
$ex->setFlags(AMQP_DURABLE);
//聲明交換機(jī)
$ex->declareExchange();
//創(chuàng)建一個(gè)消息隊(duì)列
$q = new AMQPQueue($channel);
//設(shè)置隊(duì)列名稱
$q->setName($queue);
//設(shè)置隊(duì)列持久
$q->setFlags(AMQP_DURABLE);
//聲明消息隊(duì)列
//$q->declareQueue();
//交換機(jī)和隊(duì)列通過(guò)$route進(jìn)行綁定
$q->bind($exchange, $route);
$ret = $q->consume(function($envelope, $queue) {
// 取出消息主題轉(zhuǎn)為數(shù)組
// $origin_data = json_decode($envelope->getBody(),true);
// dump($envelope->getBody());die;
/**對(duì)消息主題執(zhí)行業(yè)務(wù)**/
$res = true;
/**對(duì)消息主題執(zhí)行業(yè)務(wù)**/
// 業(yè)務(wù)處理完畢發(fā)送給MQ消費(fèi)掉該消息
if ($res) $queue->ack($envelope->getDeliveryTag()); //手動(dòng)發(fā)送ACK應(yīng)答
});
dump($ret);die;
$cnn->disconnect();
}
}
9. 每執(zhí)行一次生產(chǎn)或消費(fèi)代碼,可以在Queue中的統(tǒng)計(jì)或圖表中看到,測(cè)試代碼是否成功。
PHP快速使用RabbitMQ實(shí)現(xiàn)項(xiàng)目中部分業(yè)務(wù)的解耦相關(guān)教程
總結(jié)
以上是生活随笔為你收集整理的php订单模块解耦,PHP快速使用RabbitMQ实现项目中部分业务的解耦的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android 秒级编译FreeLine
- 下一篇: 解决兼容性的库