關於RabbitMQ的文章網上轉來轉去最多的是一篇<<[RabbitMQ+Python入門經典] 兔子和兔子窩>>(隨便給個連接了).這篇文章的講解是很風趣,很適合用來理解一些基礎概念.理解了概念之後就要進行一些實際性的實驗了.原文給的python的例子.不是筆者想要的,筆者要用php的.php
關於php和rabbitmq網上又有一篇被轉來轉去的文章<<安裝 php-rabbit: RabbitMQ 的 PHP 擴展>>.文章裏提到的php-rabbit,筆者死活是訪問不了:python
讓幾個不一樣地方的哥們幫着訪問下載,都下載不了,推斷多是這個項目被刪除了.問一個哥們兒,說他們那用的是php-amqp.從官方下的庫居然很差使.因而死皮懶臉的管哥們要了他們正在用的版本和示例,又鑑於網上 php-amqp版本的rabbit操做細節甚少(能夠說沒有麼?),因而有了今天這份兒總結.ubuntu
測試平臺:安全
Distributor ID: Ubuntu服務器
Description: Ubuntu 9.10ide
Release: 9.10函數
Codename: karmic測試
既然是ubuntu,安裝rabbitmq服務端是很easy的事情,一條命令搞定:this
apt-get install rabbitmq-serverspa
接下來的就是折騰了將近兩天的心得體會了.
1.必需掌握的指令
添加用戶:
rabbitmqctl add_user rainbird password
添加權限:
rabbitmqctl set_permissions -p "/" rainbird ".*" ".*" ".*"
刪除測試用戶:
rabbitmqctl delete_user guest
全部指令列表(很簡單的英文):
add_user <UserName> <Password>
delete_user <UserName>
change_password <UserName> <NewPassword>
list_users
add_vhost <VHostPath>
delete_vhost <VHostPath>
list_vhosts
set_permissions [-p <VHostPath>] <UserName> <Regexp> <Regexp> <Regexp>
clear_permissions [-p <VHostPath>] <UserName>
list_permissions [-p <VHostPath>]
list_user_permissions <UserName>
list_queues [-p <VHostPath>] [<QueueInfoItem> ...]
list_exchanges [-p <VHostPath>] [<ExchangeInfoItem> ...]
list_bindings [-p <VHostPath>]
list_connections [<ConnectionInfoItem> ...]
2.vhost / 不能刪除
刪除/之後,新創建的vhost不能正常使用(即使不刪除/,新創建的vhost也是不能正常使用).不知道爲何,有待研究.
3.關於持久化
示例裏沒有一點兒和持久化相關的東東,而這倒是筆者最關心的,想一想做爲消息服務器若是不能保證消息必定被接收到,算什麼事兒啊?比着網上狂轉的python版本從php-amqp的庫裏一點一點兒翻,找到了以下持久化的設置:
接收端聲明隊列和交換機自動創建:
$ch->queue_declare($_QUEUE,false,true,false,false);
第三個參數設置true保證服務器重啓後,自動創建隊列
第五個參數設置成false防止接收端沒鏈接的時候丟失消息
$ch->exchange_declare($EXCHANGE, 'direct', false, true, false);
第四個參數設置true保證重啓後,自動創建交換機
第五個參數設置false防止接收端斷開後,交換機被刪除
發佈端聲明消息持久:
$message = new AMQPMessage(serialize($object), array('content_type' => 'text/plain', 'delivery_mode' => 2));
同時知足了上面三個條件,就能夠保證未接收的消息在服務器意外重啓之後依然存在了.
4.持久化的後遺症
好比說你初始化了一個隊列msgs.你會發現它真的持久了!每次服務器端重啓後,經過list_queues命令查看的時候都存在.可是時間久了,這個msgs咱們並不須要了,怎麼辦呢?筆者發現,想清除這個隊列只能刪除它所在的vhost,而後再重建vhost,再設置vhost的權限.
rabbitmqctl delete_vhost /
rabbitmqctl add_vhost /
rabbitmqctl set_permissions -p / rainbird '.*' '.*' '.*'
要注意,若是這個操做過程當中有接收端處於鏈接狀態它們不會自動斷開,但也不會再收到消息,須要手動從新鏈接一下.
5.關於修改監聽ip和監聽端口
出於一些須要,好比咱們有多個ip,咱們但願rabbitmq僅運行在指定的ip上.或者考慮到安全問題,咱們但願修改一下rabbitmq的監聽端口.默認安裝完成之後,在/etc下面會有一個rabbitmq的空目錄,這時候咱們須要手工建立rabbitmq.conf,並寫入相關內容.
vi /etc/rabbitmq/rabbitmq.conf
RABBITMQ_NODE_IP_ADDRESS=0.0.0.0
RABBITMQ_NODE_PORT=2222
保存之後重啓服務就生效了.
這個東東網上又沒介紹,翻了半天+無限嘗試才搞出來.
6.關於運行接收端cpu100%問題
第一眼看到接收端會運行一個while等待消息的時候,筆者就知道這個進程確定cpu佔用會100%.在代碼裏幾處while嘗試添加usleep無效後,筆者最後仍是在官方的問題列表裏找到了答案:
vi +286 amqp_wire.inc
293 while ($read < $n && (false !== ($buf = fread($this->sock, $n - $read))))
294 {
295 usleep(50000);
296 $read += strlen($buf);
297 $res .= $buf;
298 }
筆者的出發點是對的,只是沒找對while.可能有人會奇怪爲何要用usleep(50000)呢?實際上筆者有遇到運行php起來的daemon致使cpu100%的狀況.當時筆者加的是usleep(500000)也就是半秒鐘.這樣就可使進程看上去cpu佔用爲0.沒想到再降一個數量級也是能夠正常的,此次算賺到了.
7.學到了error_log函數
之前有見過這個函數,覺得是向系統日誌裏寫log的時候才用獲得呢,沒想到還能夠像下面這樣用:
function debug_msg($s)
{
//error_log($s);
}
在不一樣的地方寫上debug_msg,最後不用的時候時候,直接註釋掉error_log,不錯的小技巧!
暫時就摸索出來這麼多東西了,準備拿幾個不重要的任務跑跑穩定性試試.