1.必需掌握的指令
添加用戶:rabbitmqctl add_user rainbird password
添加權(quán)限: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.關(guān)于持久化
接收端聲明隊列和交換機(jī)自動建立:
$ch->queue_declare($_QUEUE,false,true,false,false);
第三個參數(shù)設(shè)置true保證服務(wù)器重啟后,自動建立隊列
第五個參數(shù)設(shè)置成false防止接收端沒連接的時候丟失消息
$ch->exchange_declare($EXCHANGE, 'direct', false, true, false);
第四個參數(shù)設(shè)置true保證重啟后,自動建立交換機(jī)
第五個參數(shù)設(shè)置false防止接收端斷開后,交換機(jī)被刪除
發(fā)布端聲明消息持久:
$message = new AMQPMessage(serialize($object), array('content_type' => 'text/plain', 'delivery_mode' => 2));
同時滿足了上面三個條件,就可以保證未接收的消息在服務(wù)器意外重啟以后依然存在了.
4.持久化的后遺癥
比如說你初始化了一個隊列msgs.你會發(fā)現(xiàn)它真的持久了!每次服務(wù)器端重啟后,通過list_queues命令查看的時候都存在.但是時間久了,這個msgs我們并不需要了,想清除這個隊列只能刪除它所在的vhost,然后再重建vhost,再設(shè)置vhost的權(quán)限.
rabbitmqctl delete_vhost /
rabbitmqctl add_vhost /
rabbitmqctl set_permissions -p / rainbird '.*' '.*' '.*'
要注意,如果這個操作過程中有接收端處于連接狀態(tài)它們不會自動斷開,但也不會再收到消息,需要手動重新連接一下.
5.關(guān)于修改監(jiān)聽ip和監(jiān)聽端口
出于一些需要,比如我們有多個ip,我們希望rabbitmq僅運(yùn)行在指定的ip上.或者考慮到安全問題,我們希望修改一下rabbitmq的監(jiān)聽端口.默認(rèn)安裝完成以后,在/etc下面會有一個rabbitmq的空目錄,這時候我們需要手工創(chuàng)建rabbitmq.conf,并寫入相關(guān)內(nèi)容.
vi /etc/rabbitmq/rabbitmq.conf
RABBITMQ_NODE_IP_ADDRESS=0.0.0.0
RABBITMQ_NODE_PORT=2222
保存以后重啟服務(wù)就生效了.
6.關(guān)于運(yùn)行接收端cpu100%問題
在官方的問題列表里有如下內(nèi)容:
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 }
為什么要用usleep(50000)呢?實際上usleep(500000)也就是半秒鐘.這樣就可以使進(jìn)程看上去cpu占用為0.沒想到再降一個數(shù)量級也是可以正常的.
7.error_log函數(shù)
function debug_msg($s)
{
//error_log($s);
}
在不同的地方寫上debug_msg,最后不用的時候時候,直接注釋掉error_log。