1. 程式人生 > >PHP版 RabbitMQ小技巧(一)用程式碼獲得伺服器上的訊息佇列名

PHP版 RabbitMQ小技巧(一)用程式碼獲得伺服器上的訊息佇列名

  最近在新浪開發一個用了MQ的URL監控專案,對PHP版的RabbitMQ有一些瞭解。想先吐個槽,就算是今年1月份的某些MQ的教程,很多都是不對的,和我在4月份看到的 官方的Tutorial 都有不小區別,看來RabbitMQ的官方最近發生了很大的革新呀。下面直接進入主題。
  老規矩,直接講乾貨,我直接跳過Erlang平臺和RabbitMQ的安裝。

1. 利用MQ的.bat獲得訊息佇列

  不要懷疑為什麼我會講MQ的.bat命令,這是曲線救國策略,最根本的原因是PHP的MQ不能通過某個函式直接獲得伺服器上面部署的訊息佇列,

如下圖,我設定了幾個測試佇列,並放入了5條測試訊息。
MQ上面的測試佇列

在RabbitMQ可使用的條件下,利用自帶的bat檔案即可完成命令列獲得佇列
命令列獲得佇列

2. PHP程式碼獲得訊息佇列

  在這部分我會用到正則表示式,不熟悉的同學可以看看這篇簡短的部落格 《PHP正則表示式入門教程》 ,包客官您滿意。

Linux系統

define("RABBIT_SERVER_PATH", '/usr/local/lib/erlang/lib/rabbitmq_server-0.0.0'); 
$cmd = RABBIT_SERVER_PATH . '/sbin/rabbitmqctl list_queues';
exec($cmd, $res);
for ($i = 1
; $i < count($res); $i++){ preg_match("/[\w\W]+(?=\s)/", $res[$i], $matches); $queueNames[] = trim($matches[0]); unset($matches); } var_dump($queueNames);
  • RABBIT_SERVER_PATH,是MQ的安裝位置,
  • exec($cmd, $res),執行list_queues命令,MQ的server會返回佇列到$res中,並會形成陣列,形如下圖:
    命令列獲得佇列
  • “/[\w\W]+(?=\s)/”,分為2部分看,[\w\W]+為了捕捉所有的中文、英文、數字、字元,(?=\s)為正向預查空字元。比如當返回“testQueue2   2”時,會捕捉到字串“testQueue2”。
  • trim($match[0]),有時捕捉的字串太短,所以會捕捉到空字元,去除即可。

最後輸出如下圖:
最終輸出圖片

Windows系統

//注意Windows路徑分隔是反斜槓“\”。
define("RABBIT_SERVER_PATH", 'cd E:\RabbitMQ Server\rabbitmq_server-3.6.6');  
$cmd = RABBIT_SERVER_PATH . ' & .\sbin\rabbitmqctl list_queues';
exec($cmd, $res);
for ($i = 1; $i < count($res); $i++){
    preg_match("/[\w\W]+(?=\s)/", $res[$i], $matches);
    $queueNames[] = trim($matches[0]);
    unset($matches);
}
var_dump($queueNames);

程式碼與上面類似,不再贅述,最終輸出如下圖:
最終結果

3. 額外補充

個人感想:
  我承認這種辦法很詭異,但是確實是沒有辦法的辦法了,很多時候必須要獲得目前伺服器上的佇列名才能寫某些業務,比如,寫消費者的時候、想自動化檢測是否初始化MQ部署的時候等等。
  如果有更好的獲取MQ伺服器的方法,請聯絡本人1,必將更好方法更新於此篇博文,將知識分享給大眾。
  下一篇文章將會講解一些最新的MQ的使用方法,敬請期待。

後期優化方案:
  程式碼速度還不夠快,Linux要1s左右,Windows居然要4s,時間肯定是不能適應企業應用情景。如果要頻繁獲取佇列,個人推薦利用Memcached擴充套件,把佇列加入記憶體中,理論上讀取時間在ms級別。

  1. 郵箱地址:[email protected]