使用php-amqplib串連rabbitMQ 學習筆記及總結

來源:互聯網
上載者:User

標籤:項目   正則匹配   忽略   array類   sleep   direct   筆記   sage   function   

1、使用composer安裝php-amqplib
在你的項目中添加一個 composer.json檔案:  {     "require": {      "php-amqplib/php-amqplib": "2.6.*"     } }只要你已經安裝Composer功能,你可以運行以下:   $ composer install已經存在的項目則執行    $ composer update
這時在verdor目錄就已經下載完畢

具體可以參考官方文檔:https://github.com/php-amqplib/php-amqplib
2、使用php-amqplib
英文文檔:http://www.rabbitmq.com/getstarted.html
中文文檔:https://rabbitmq.shujuwajue.com/tutorials_with_php/[2]Work_Queues.md.html

總結:官方文檔看起來有點亂,總結了一下,基本都是互連的,以下為簡單基本步驟,僅供參考,NO BB。生產者:1、建立串連主要參數說明:$host: RabbitMQ伺服器主機IP地址$port: RabbitMQ伺服器連接埠$user: 串連RabbitMQ伺服器的使用者名稱$password: 串連RabbitMQ伺服器的使用者密碼$vhost: 串連RabbitMQ伺服器的vhost(伺服器可以有多個vhost,虛擬機器主機,類似nginx的vhost)$connection = new AMQPStreamConnection($host,$port,$user,$password,$vhost); 2、擷取通道 // $channel_id 通道id,不傳則擷取$channel[“”]通道,再無則迴圈$this->channle數組,下標從1到最大通道數找第一個不是AMQPChannel對象的下標,執行個體化並返回AMQPChannel對象,無則拋出異常No free channel ids$channel = $connection->channel($channel_id);3、在通道裡建立交換器 # $exhcange_name 交換器名字 # $type 交換器類型:’’ 預設交換器 匿名交換器 未顯示宣告類型都是該類型fanout 扇形交換器 會發送訊息到它所知道的所有隊列,每個消費者擷取的訊息都是一致的headers 頭部交換器direct 直連交換器,該交換器將會對綁定鍵(binding key)和路由鍵(routing key)進行精確匹配topic 話題交換器 該交換器會對路由鍵正則匹配,必須是*(一個單詞)、#(多個單詞,以.分割) 、 user.key .abc.* 類型的keyrpc #$passive false#durable false#auto_detlete false $channel->exchange_declare($exhcange_name,$type,$passive,$durable,$auto_delete);//常用設定 $passive=>false $durable=>false $auto_delete->false4、建立要發送的資訊 ,可以建立多個訊息 #$data string類型 要發送的訊息 #$properties array類型 設定的屬性,比如設定該訊息持久化[‘delivery_mode’=>2]$msg = new AMQPMessage($data,$properties)5、發送訊息#$msg object AMQPMessage對象#$exchange string 交換器名字 #$routing_key string 路由鍵 如果交換器類型 fanout: 該值會被忽略,因為該類型的交換器會把所有它知道的隊列發訊息,無差別區別direct 只有精確匹配該路由鍵的隊列,才會發送訊息到該隊列topic 只有正則匹配到的路由鍵的隊列,才會發送到該隊列$channel->basic_publish($msg,$exchange,$routing_key);6、關閉通道和連結$channel->close();$connection->close();消費者:1、建立串連主要參數說明:$host: RabbitMQ伺服器主機IP地址$port: RabbitMQ伺服器連接埠$user: 串連RabbitMQ伺服器的使用者名稱$password: 串連RabbitMQ伺服器的使用者密碼$vhost: 串連RabbitMQ伺服器的vhost(伺服器可以有多個vhost,虛擬機器主機,類似nginx的vhost)$connection = new AMQPStreamConnection($host,$port,$user,$password,$vhost); 2、擷取通道 // $channel_id 通道id,不傳則擷取$channel[“”]通道,再無則迴圈$this->channle數組,下標從1到最大通道數找第一個不是AMQPChannel對象的下標,執行個體化並返回AMQPChannel對象,無則拋出異常No free channel ids$channel = $connection->channel($channel_id);3、在通道裡建立交換器,未顯式聲明交換器都是使用匿名交換器 # $exhcange_name 交換器名字 # $type 交換器類型:’’ 預設交換器 匿名交換器 未顯示宣告類型都是該類型fanout 扇形交換器 會發送訊息到它所知道的所有隊列,每個消費者擷取的訊息都是一致的headers 頭部交換器direct 直連交換器,該交換器將會對綁定鍵(binding key)和路由鍵(routing key)進行精確匹配topic 話題交換器 該交換器會對路由鍵正則匹配,必須是*(一個單詞)、#(多個單詞,以.分割) 、 user.key .abc.* 類型的keyrpc #$passive false#durable false#auto_detlete false $channel->exchange_declare($exhcange_name,$type,$passive,$durable,$auto_delete);//常用設定 $passive=>false $durable=>false $auto_delete->false4、聲明消費者隊列(1) 非持久化隊列,RabbitMQ退出或者崩潰時,該隊列就不存在 list($queue_name, ,) = $channel->queue_declare("", false, false, false, false) (2) 持久化隊列(需要顯示聲明,第三個參數要設定為true),儲存到磁碟,但不一定完全保證不丟失資訊,因為儲存總是要有時間的。 list($queue_name, ,) = $channel->queue_declare("ex_queue", false, false, true, false)5、綁定交換器,當未顯示綁定交換器時,預設是綁定匿名交換器 #綁定:交換器與隊列的關係,如下面這句代碼意思是,$queue_name隊列對logs交換器資料感興趣,該隊列就消費該交換器傳過來的資料:這個隊列(queue)對這個交換器(exchange)的訊息感興趣. $binding_key預設為空白,表示對該交換器所有訊息感興趣,如果值不為空白,則該隊列只對該類型的訊息感興趣(除了fanout交換器以外) $channel->queue_bind($queue_name, ‘logs‘, $binding_key);6、消費訊息#該代碼錶示使用basic.qos方法,並設定prefetch_count=1。這樣是告訴RabbitMQ,再同一時刻,不要發送超過1條訊息給一個工作者(worker),直到它已經處理了上一條訊息並且作出了響應。這樣,RabbitMQ就會把訊息分發給下一個閒置工作者(worker),輪詢、負載平衡配置#$channel->basic_qos(null, 1, null);#第四個參數 no_ack = false 時,表示進行ack應答,確保訊息已經處理#$callback 表示回呼函數,傳入訊息參數$channel->basic_consume(‘ex_queue‘, ‘‘, false, false, false, false, $callback);$callback = function($msg){ echo " [x] Received ", $msg->body, "\n"; sleep(substr_count($msg->body, ‘.‘)); echo " [x] Done", "\n";#當no_ack=false時, 需要寫下行代碼,否則可能出現記憶體不足情況#$msg->delivery_info[‘channel‘]->basic_ack($msg->delivery_info[‘delivery_tag‘]);};#監聽訊息,一有訊息,立馬就處理while(count($channel->callbacks)) { $channel->wait();}

 

使用php-amqplib串連rabbitMQ 學習筆記及總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.