本文目錄一覽:
- 1、rabbitmq php消費端需要守護進程嗎
- 2、如何用php獲取rabbitmq指定隊列中的未處理消息數量
- 3、rabb.it有哪些用戶值得關注
- 4、php rabbitmq 哪個擴展最好
- 5、php 從rabbitmq consume 和 get的區別
- 6、php的amqp應該怎樣使用
rabbitmq php消費端需要守護進程嗎
隊列你說能實現什麼功能?一般都是用來做無須前台參與的功能,或者說避免前台等待時間過長的功能,比如,你要發郵件。這個時間就比較長,如果你扔隊列裡面,告訴前台已經OK,然後由隊列 去慢慢發,是不是給用戶的感覺就是速度好快埃
如何用php獲取rabbitmq指定隊列中的未處理消息數量
are一個隊列,置AMQP_PASSIVE標誌位,就不會影響服務端狀態,並返回消息計數。 $conn = new AMQPConnection(); //… $queue = new AMQPQueue($conn); $queue-setFlags(AMQP_PASSIVE); $messageCount = $queue-declare($queueName);
你可以去後盾人平台看看,裡面的東西不錯
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,不錯的小技巧!
暫時就摸索出來這麼多東西了,準備拿幾個不重要的任務跑跑穩定性試試.
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 copy
#!/bin/bash
set -e
#install cmake
yum -y install cmake
#download rabbitmq-c
wget
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的amqp應該怎樣使用
我安裝了rabbitmq和php的amqp擴展,但是不知道怎麼使用,我在網上搜了教程,但是不是太懂,
這是send.php文件,
$conf=[
‘host’=’localhost’,
‘port’=’5672’,
‘login’=’guest’,
‘password’=’guest’,
‘vhost’=’/’
];
$connect=new \AMQPConnection($conf);
if(!$connect-connect()){
die(‘connetc error’);
}
$message = “TEST MESSAGE! 測試消息!”;
$channel=new AMQPChannel($connect);
$exchange=new AMQPExchange($channel);
$exchange-setName(‘zblExchange’);
$queue = new AMQPQueue($channel);
$queue-setName(‘zblQueue’);
for($i=0; $i5; ++$i){
echo “Send Message:”.$exchange-publish($message, ‘zblQueue’).”\n”;
}
//$channel-commitTransaction(); //提交事務
$connect-disconnect();
這是receive.php文件
$conf=[
‘host’=’localhost’,
‘port’=’5672’,
‘login’=’guest’,
‘password’=’guest’,
‘vhost’=’/’
];
$connect=new AMQPConnection($conf);
if(!$connect-connect()){
die(‘connetc error’);
}
$channel=new AMQPChannel($connect);
$exchange=new AMQPExchange($channel);
$exchange-setName(‘zblExchange’);
$exchange-setType(AMQP_EX_TYPE_DIRECT);
//echo “Exchange Status:”.$exchange-declare().”\n”;
$queue = new AMQPQueue($channel);
$queue-setName(‘zblQueue’);
$queue-setFlags(AMQP_DURABLE); //持久化
echo “Message Total:”.$queue-declare().”\n”;
echo ‘Queue Bind: ‘.$queue-bind(‘zblExchange’, ‘zblQueue’).”\n”;
echo “Message:\n”;
//while(True){
$queue-consume(‘processMessage’);
//echo’hello’;
//$q-consume(‘processMessage’, AMQP_AUTOACK); //自動ACK應答
//}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/247718.html