rabbit以及php,Rabbit!

本文目錄一覽:

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-tw/n/247718.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:22
下一篇 2024-12-12 13:22

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若伺服器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • PHP版本管理工具phpenv詳解

    在PHP項目開發過程中,我們可能需要用到不同版本的PHP環境來試驗不同的功能或避免不同版本的兼容性問題。或者我們需要在同一台伺服器上同時運行多個不同版本的PHP語言。但是每次手動安…

    編程 2025-04-24
  • PHP數組去重詳解

    一、array_unique函數 array_unique是php中常用的數組去重函數,它基於值來判斷元素是否重複,具體使用方法如下: $array = array(‘a’, ‘b…

    編程 2025-04-24
  • PHP導出Excel文件

    一、PHP導出Excel文件列寬調整 當我們使用PHP導出Excel文件時,有時需要調整單元格的列寬。可以使用PHPExcel類庫中的setWidth方法來設置單元格的列寬。下面是…

    編程 2025-04-24
  • php擴展庫初探

    一、什麼是php擴展庫? PHP擴展庫(PHP extension)是一些用C語言編寫的動態鏈接庫,用於擴展PHP的功能。PHP擴展庫使得PHP可以與各種資料庫系統相連、SMTP、…

    編程 2025-04-23

發表回復

登錄後才能評論