摘要:安裝操作庫在你的項目目錄下的文件中增加下面內容增加這行然后接著執行。分別為規則說明精準推送廣播。推送到綁定到此交換機下的所有隊列組播。
mq的安裝和php的擴扎在另外文章說明
首先,建議去大概了解下RabbitMQ(以下簡稱mq)的基本工作原理,可以參考這篇文章
最主要的幾個對象如下
對象名稱 | |
---|---|
borker | 相當于mq server |
channel | 通道或者頻道 |
exchange | 交換機 |
queue | 隊列 |
vhost | 虛擬主機(項目隊列隔離使用) |
這幾個對象在上面的文章說描述的已經非常清楚,這里不要敘述了。
安裝操作庫在你的項目目錄下的composer.json文件中增加下面內容
{ "require": { "php-amqplib/php-amqplib": "2.7.*" //增加這行 } }
然后接著執行composer update php-amqplib/php-amqplib。更加方便的做法是如果你的項目已經有了composer.json那么執行執行
composer require php-amqplib/php-amqplib便可以直接進行安裝了
首先需要定義交換機、隊列以及路由關鍵字(routing key) 下面是示例代碼
"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();
有幾個地方需要注意:
$routingKey其實是可以省略的,但是一般都帶上方便交換機對消息進行不同隊列的推送
如果綁定的時候使用了$routingKey,那么在bashic_publish的時候也要指定$routingKey,不然交換機無法路由到指定隊列,默認就推送到不使用關鍵字的隊列了(這在我實驗的時候遇到的一個坑)
上面的exchange_declare和queue_declare以及queue_bind其實也不是必須的,如果在代碼運行之前這行交換機和隊列名稱以及通過管理后臺的方式手動添加在mq上,那么可以執行使用,而不需要上面的這3句代碼。
執行上面的代碼后你也可以在mq管理后臺看到對應的顯示,如下圖
添加后的交換機顯示
添加后的隊列顯示
隊列與交換機的綁定關系,以及綁定的路由關鍵字
上面的代碼中,當我們聲明初始化交換機的時候第二個參數使用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.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26182.html
摘要:在中間的框是一個隊列的消息緩沖區,保持代表的消費。本教程介紹,這是一個開放的通用的協議消息。我們將在本教程中使用,解決依賴管理。發送者將連接到,發送一條消息,然后退出。注意,這與發送發布的隊列匹配。 介紹 RabbitMQ是一個消息代理器:它接受和轉發消息。你可以把它當作一個郵局:當你把郵件放在信箱里時,你可以肯定郵差先生最終會把郵件送到你的收件人那里。在這個比喻中,RabbitMQ就...
摘要:的定義是使用語言開發的開源消息隊列系統,完整的實現了高級抽象層消息通信協議。交換機接受發送的消息,并根據綁定規則轉發到對應的隊列。默認是無名交換使用空字符串標識。消息隊列是內部對象,用于存儲未被消費的消息。 RabbitMQ的定義 RabbitMQ是使用erlang語言開發的開源消息隊列系統,完整的實現了AMPQ(高級抽象層消息通信協議)。 Mac下RabbitMQ安裝 使用Hom...
摘要:你或許在思考數據分發無阻塞作業或者消息推送。所有的這些模式,都是消息隊列的一部分。這部分代碼可以改寫應用作簡單的異步隊列任務的場景,但到了高并發高可用需求下就要進行額外的一些處理。在之后的文章中我會講到的競爭消費模式和的用法。 你或許在思考數據分發、無阻塞作業或者消息推送。或者你想要進行發布/訂閱,異步任務,工作隊列。所有的這些模式,都是消息隊列的一部分。 1.安裝RabbmitMQ ...
摘要:當關閉的時候,隊列將被刪除。空是自動刪除綁定隊列和交換機,生成發送消息到隊列持久化,重啟不會丟失,默認為,重啟會丟失 環境 1.安裝rabbit php使用 安裝包,直接安裝composer 安裝php-amqplib/php-amqplib 這個包 生產著 連接mq server require_once __DIR__./vendor/autoload.php; use PhpAm...
摘要:消息隊列,用于存儲還未被消費者消費的消息。由在與時指定,而由發送時指定,兩者的匹配方式由決定。需要為每一個創建,協議規定只有通過才能執行的命令。建議客戶端線程之間不要共用,至少要保證共用的線程發送消息必須是串行的,但是建議盡量共用。 安裝 rabbitmq 在 mac 下可以直接用 brew 安裝默認安裝在 /usr/local/Cellar/下命令被軟連接加入到了/usr/local...
閱讀 2804·2021-11-19 11:35
閱讀 2582·2021-11-02 14:40
閱讀 1396·2021-09-04 16:48
閱讀 3009·2019-08-30 15:55
閱讀 1756·2019-08-30 13:11
閱讀 1956·2019-08-29 11:12
閱讀 1088·2019-08-27 10:52
閱讀 3157·2019-08-26 18:36