『壹』 rabb.it有哪些用戶值得關注
關於RabbitMQ的文章網上轉來轉去最多的是一篇<<[RabbitMQ+python入門經典] 兔子和兔子窩>>(隨便給個鏈接了).這篇文章的講解是很風趣,很適合用來理解一些基礎概念.理解了概念以後就要進行一些實際性的實驗了.原文給的python的例子.不是筆者想要的,筆者要用php的.
關於php和rabbitmq網上又有一篇被轉來轉去的文章<<安裝 php-rabbit: RabbitMQ 的 PHP 擴展>>.文章里提到的php-rabbit,筆者死活是訪問不了:
讓幾個不同地方的哥們幫著訪問下載,都下載不了,推斷可能是這個項目被刪除了.問一個哥們兒,說他們那用的是php-amqp.從官方下的庫竟然不好使.於是死皮懶臉的管哥們要了他們正在用的版本和示例,又鑒於網上 php-amqp版本的rabbit操作細節甚少(可以說沒有么?),於是有了今天這份兒總結.
測試平台:
Distributor ID: Ubuntu
Description: Ubuntu 9.10
Release: 9.10
Codename: karmic
既然是ubuntu,安裝rabbitmq服務端是很easy的事情,一條命令搞定:
apt-get install rabbitmq-server
接下來的就是折騰了將近兩天的心得體會了.
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,不錯的小技巧!
暫時就摸索出來這么多東西了,准備拿幾個不重要的任務跑跑穩定性試試.
『貳』 rabbitmq官網中的php測試helloworld的代碼是否有問題
<?php
require_once __DIR__ . '/vendor/autoload.php';use PhpAmqpLib\Connection\AMQPConnection;use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello');echo " [x] Sent 'Hello World!'\n";
$channel->close();
$connection->close();
?>
receive.php
<?php
require_once __DIR__ . '/vendor/autoload.php';use PhpAmqpLib\Connection\AMQPConnection;$connection = new AMQPConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";$callback = function($msg) {
echo " [x] Received ", $msg->body, "\n";
};
$channel->basic_consume('hello', '', false, true, false, false, $callback);while(count($channel->callbacks)) {
$channel->wait();
}
$channel->close();
$connection->close();
?>
『叄』 php rabbitmq能實現什麼功能
隊列你說能實現什麼功能?一般都是用來做無須前台參與的功能,或者說避免前台等待時間過長的功能,比如,你要發郵件。這個時間就比較長,如果你扔隊列裡面,告訴前台已經OK,然後由隊列 去慢慢發,是不是給用戶的感覺就是速度好快啊。
『肆』 php下rabbitmq怎麼實現消費者自動觸發
您好,很高興為您解答。 declare一個隊列,置AMQP_PASSIVE標志位,就不會影響服務端狀態,並返回消息計數。 $conn = new AMQPConnection();//...$queue = new AMQPQueue($conn);$queue->setFlags(AMQP_PASSIVE);$messageCount = $queue->declare
『伍』 我為什麼要選擇RabbitMQ
RabbitMQMQ在雲計算的地位RabbitMQ大事記RabbitMQ賣點健壯易於使用高性能強大開源社區支持AMQP工作組成員,
目前支持AMQP0-9-1RabbitMQ生態圈顯微鏡看RabbitMQ為什麼要用Erlang實現Erlang消息機制與AMQP極度吻合高並發時間檢驗的高可靠高性能集群易擴展強大的管理功能方便的問題定位支持
AMQP交互圖實現足夠簡單清晰高並發的秘密處處維穩自我保護AMQP協議級別流控ErlangVM層面內存、
CPU過載防護集群層面容災預先警報性能(單Q)性能(8個Q)集群(邏輯視圖)集群(物理布局)高可用集群無中心點。
『陸』 php怎麼接收rabbitmq的數據
are一個隊列,置AMQP_PASSIVE標志位,就不會影響服務端狀態,並返回消息計數。 $conn = new AMQPConnection(); //... $queue = new AMQPQueue($conn); $queue->setFlags(AMQP_PASSIVE); $messageCount = $queue->declare($queueName);
『柒』 php 從rabbitmq consume 和 get的區別
以下是阿里雲查到的解釋
在RabbitMQ中消費者有2種方式獲取隊列中的消息:
a)一種是通過basic.consume命令,訂閱某一個隊列中的消息,channel會自動在處理完上一條消息之後,接收下一條消息。(同一個channel消息處理是串列的)。除非關閉channel或者取消訂閱,否則客戶端將會一直接收隊列的消息。
b)另外一種方式是通過basic.get命令主動獲取隊列中的消息,但是絕對不可以通過循環調用basic.get來代替basic.consume,這是因為basic.get RabbitMQ在實際執行的時候,是首先consume某一個隊列,然後檢索第一條消息,然後再取消訂閱。如果是高吞吐率的消費者,最好還是建議使用basic.consume。
簡單總結一下就是說:
consume是只要隊列裡面還有消息就一直取。
get是只取了隊列裡面的第一條消息。
因為get開銷大,如果需要從一個隊列取消息的話,首選consume方式,慎用循環get方式。
『捌』 php rabbitmq 哪個擴展最好
Linux 上面一般需要自己編譯
注意:擴展是C寫的,由於C與RabbitMQ通信一般需要依賴rabbitmq-c庫(也就是librabbitmq),所以編譯擴展前需要先裝依賴庫。不同版本的擴展,對php版本和librabbitmq兼容性不一樣。下面這個版本是經過本人測試的,可以兼容的。
rabbitmq-c -0.4.1 , amqp 擴展 1.4.0 , php 5.5.9
一鍵安裝腳本:
[cpp] view plain
#!/bin/bash
set -e
#install cmake
yum -y install cmake
#download rabbitmq-c
wget https://github.com/alanxz/rabbitmq-c/rel
『玖』 celery隊列調用rabbitmq
相比 PHP,Python 可以非常自然的擴展到隊列(RabbitMQ)、後台處理系統(基於 Celery)、數據挖掘(SciPy、NumPy)、文本處理(NLTK)、系統部署(Fabric)、監控(Supervisord)等所有方面,而 PHP 只能做網頁前台。