mq的安裝和php的擴紮在另外文章說明php
首先,建議去大概瞭解下RabbitMQ(如下簡稱mq)的基本工做原理,能夠參考這篇文章
最主要的幾個對象以下html
對象名稱 | |
---|---|
borker | 至關於mq server |
channel | 通道或者頻道 |
exchange | 交換機 |
queue | 隊列 |
vhost | 虛擬主機(項目隊列隔離使用) |
這幾個對象在上面的文章說描述的已經很是清楚,這裏不要敘述了。json
在你的項目目錄下的composer.json文件中增長下面內容bash
{ "require": { "php-amqplib/php-amqplib": "2.7.*" //增長這行 } }
而後接着執行composer update php-amqplib/php-amqplib
。更加方便的作法是若是你的項目已經有了composer.json那麼執行執行composer require php-amqplib/php-amqplib
即可以直接進行安裝了composer
首先須要定義交換機、隊列以及路由關鍵字(routing key) 下面是示例代碼ui
<?php require 'vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage; $conf = [ 'host' => '127.0.0.1', 'port' => 5672, 'user' => 'kd_dev', 'pwd' => 'kd_dev', 'vhost' => '/', ]; $exchangeName = 'kd_sms_send_ex'; //交換機名 $queueName = 'kd_sms_send_q'; //隊列名稱 $routingKey = 'sms_send'; //路由關鍵字(也能夠省略) $conn = new AMQPStreamConnection( //創建生產者與mq之間的鏈接 $conf['host'], $conf['port'], $conf['user'], $conf['pwd'], $conf['vhost'] ); $channel = $conn->channel(); //在已鏈接基礎上創建生產者與mq之間的通道 $channel->exchange_declare($exchangeName, 'direct', false, true, false); //聲明初始化交換機 $channel->queue_declare($queueName, false, true, false, false); //聲明初始化一條隊列 $channel->queue_bind($queueName, $exchangeName, $routingKey); //將隊列與某個交換機進行綁定,並使用路由關鍵字 $msgBody = json_encode(["name" => "iGoo", "age" => 22]); $msg = new AMQPMessage($msgBody, ['content_type' => 'text/plain', 'delivery_mode' => 2]); //生成消息 $r = $channel->basic_publish($msg, $exchangeName, $routingKey); //推送消息到某個交換機 $channel->close(); $conn->close();
有幾個地方須要注意:spa
執行上面的代碼後你也能夠在mq管理後臺看到對應的顯示,以下圖
添加後的交換機顯示rest
添加後的隊列顯示code
隊列與交換機的綁定關係,以及綁定的路由關鍵字server
上面的代碼中,當咱們聲明初始化交換機的時候第二個參數使用direct
參數,其實還有另外3種參數可選。分別爲
規則 | 說明 |
---|---|
direct | 精準推送 |
fanout | 廣播。推送到綁定到此交換機下的全部隊列 |
topic | 組播。好比上面我綁定的關鍵字是sms_send,那麼他能夠推送到*.sms_send的全部隊列 |
headers | 這個目前不知道是如何推送的 |
下一篇在簡單的演示一下客戶端如何消費隊列
---更新---
更新一下在建立交換機和隊列的時候各個經常使用參數說明
name: $queue // should be unique in fanout exchange. [隊列名稱] passive: false // don't check if a queue with the same name exists [是否檢測同名隊列] durable: false // the queue will not survive server restarts [是否開啓隊列持久化] exclusive: false // the queue might be accessed by other channels [隊列是否能夠被其餘隊列訪問] auto_delete: true //the queue will be deleted once the channel is closed. [通道關閉後是否刪除隊列]
name: $exchange [交換機名稱] type: direct [路由類型] passive: false [] durable: true [交換機是否開啓持久化] auto_delete: false //the exchange won't be deleted once the channel is closed.