日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

callmode php_Rabbitmq各方法的作用详解

發布時間:2023/12/4 php 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 callmode php_Rabbitmq各方法的作用详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

exchange_declare('direct_logs','direct',false,false,false);// 這個是申明交換器,如果沒有申明就給默認隊列的這個交換器,而且發送的類型默認是direct)

順序

參數名

默認值

作用

1

$exchange

交換機名

2

$type

交換機類型,分別有direct、fanout、topic

3

$passsive

false

只判斷不創建(一般用于判斷該交換機是否存在),如果你希望查詢交換機是否存在.而又不想在查詢時創建這個交換機.設置此為true即可

如果交換機不存在,則會拋出一個錯誤的異常.如果存在則返回NULL

4

$durable

false

表示了如果MQ服務器重啟,這個交換機是否要重新建立(如果設置為true則重啟mq,該交換機還是存在,相當于持久化。)

我們的案例代碼有點類似于在服務器設立一個數據庫內存表,并且每次訪問都要判定內存表是否存在.

而如果開啟了這個屬性,則相當于建了一個永久表.以后直接訪問即可.不需要每次都判定是否存在.如同訪問MYSQL。

5

$auto_delete

true

無用自動銷毀。如果綁定的所有隊列都不在使用了.是否自動刪除這個交換機.(比如設置為true,它綁定的對列全部被刪除后,該交換器會被自動刪除,)

6

$internal

false

內部交換機.即不允許使用客戶端推送消息.MQ內部可以讓交換機作為一個隊列綁定到另外一個交換機下.想想一下以太網的交換機就是了.所以開啟這個屬性,表示是一個他直接收其他交換機發來的信息

7

$nowait

false

如果為True則表示不等待服務器回執信息.函數將返回NULL,可以提高訪問速度..應用范圍不確定

8

$arguments

null

額外的一些參數,比如優先級,什么的.需要單獨開篇講

9

$ticket

null

未知

queue_declare('queueName', false, true, false, true, false)

順序

參數名

默認值

作用

1

$queue

隊列名.而存在默認值的意思是.你可以創建一個不重復名稱的一個臨時隊列.(交換機沒法創建臨時的)

如獲得通道后執行如下代碼.

2

$passsive

false

只判斷不創建(判斷該隊列是否存在) 只查詢不創建.如果為true,如果存在這個隊列,則會返回隊列的信息.如果不存在這個隊列..則會拋異常(與交換機不同的是,如果交換機判斷存在,則返回NULL,否則異常)

3

$durable

false

重啟重建(持久化)

4

$exclusive

false

排他隊列,如果你希望創建一個隊列,并且只有你當前這個程序(或進程)進行消費處理.不希望別的客戶端讀取到這個隊列.用這個方法甚好.而同時如果當進程斷開連接.這個隊列也會被銷毀.不管是否設置了持久化或者自動刪除.

5

$auto_delete

true

自動銷毀(當最后一個消費者取消訂閱時隊列會自動移除,對于臨時隊列只有一個消費服務時適用,)

6

$nowait

false

執行后不需要等結果

7

$arguments

null

$arguments = new AMQPTable([

'x-message-ttl'????????? => 10000,? // 延遲時間 (毫秒)創建queue時設置該參數可指定消息在該queue中待多久,可根據x-dead-letter-routing-key和x-dead-letter-exchange生成可延遲的。

'x-expires'????????????? => 26000,? // 隊列存活時間? 如果一個隊列開始沒有設置存活時間,后面又設置是無效的。

'x-dead-letter-exchange' => 'exchange_direct_ttl3',? // 延遲結束后指向交換機(死信收容交換機)

'x-dead-letter-queue'??? => 'queue_ttl3',? // 延遲結束后指向隊列(死信收容隊列),

//'x-dead-letter-routing-key' => 'queue_ttl3',? // 設置routing-key

//'x-max-priority'=>'10' //聲明優先級隊列.表示隊列應該支持的最大優先級。建議使用1到10之間.該參數會造成額外的CPU消耗。

]

);

8

$ticket

null

queue_bind('queue_delete1', 'exchange_delete1');

參數序號

參數名

作用

1

$queue

隊列名

2

$exchange

交換機名

3

$routing_key

路由名(對應)

4

$nowait

不等待執行結果

5

$arguments

額外參數

6

$ticket

….

$message = new AMQPMessage("消息內容",['配置項'=>'配置值']);

配置項

類型

說明

content_type

短文本

MIME類型表示消息是一種什么類型的格式,參考

content_encoding

短文本

正文傳輸編碼,比如內容是gzip壓縮的.值就是gzip,

application_headers

數組

請求的headers信息

delivery_mode

數字

表示是否持久化,1為否,2為是

priority

數字

發送權重,也就是優先級

correlation_id

短文本

相關性ID

reply_to

短文本

消息被發送者處理完后,返回回復時執行的回調(在rpc時會用到)

expiration

短文本

存活時間,毫秒數

message_id

短文本

擴展屬性

timestamp

數字

時間戳

type

短文本

擴展屬性

user_id

短文本

擴展屬性

app_id

短文本

擴展屬性

cluster_id

短文本

擴展屬性

Basic_publish($msg,$exchange,$routing_key)

順序

參數名

作用

1

$msg

消息對象

2

$exchange

消息對象(交換機名稱) 如果沒有指定交換器,會指定一個默認的交換器,第三個參數是路由鍵,當申明一個隊列時,它會自動綁定到默認交換器,并以隊列名稱作為路由鍵。那么這段代碼會自動發送到hello的隊列??? (hello隊列必須事先申明好)。所以這種消息,當有多個進程時會均勻的分給不同的進程處理

3

$routing_key

消息的路由名

4

$mandatory

消息至少有一個隊列能夠接受,如果交換機無法把消息發送到具體的隊列中,是否要把消息發送到失敗投遞記錄中,而不是讓其消失(當mandatory標志位設置為true時,如果exchange根據自身類型和消息routingKey無法找到一個合適的queue存儲消息,那么broker會調用basic.return方法將消息返還給生產者;當mandatory設置為false時,出現上述情況broker會直接將消息丟棄;通俗的講,mandatory標志告訴broker代理服務器至少將消息route到一個隊列中,否則就將消息return給發送者;)

5

$immediate

這個是一個被作廢的屬性.

6

$ticket

function接收消息回調($message)

{

$message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);

}

代碼的意思為,根據消息的delivery_info['channel']找到通道,并調用通道的basic_ack方法發送消息的確認內容.

##泄露問題

如果我們只是接受了消息,并進行處理.但是處理完后.沒有發起ack就會導致服務器上的消息一直堆積.服務器會發送新的消息.同時會記錄當前的這個鏈接有哪些消息一直還沒回復.(服務器認為你會回復,一直等待)。如果消費者進程停止掉重啟..就會重新接收所有消息!

$channel->basic_qos(null, 1, null);

可告知RabbitMQ只有在consumer處理并確認了上一個message后才分配新的message給他,否則上一個沒處理完會一直卡在這里,這個根據業務場景配置,

basic_qos注意事項:由于消費者自身處理能力有限,從rabbitmq獲取一定數量的消息后,希望rabbitmq不再將隊列中的消息推送過來,當對消息處理完后(即對消息進行了ack,并且有能力處理更多的消息)再接收來自隊列的消息

這時候我們就需要要到basic_qos,

basic_qos($prefetch_size,

$prefetch_count, //最重要的參數,未確認的消息同時存在的個數;(也就是未ack的消息數,我們可以以此來作為記錄失敗數據的個數;)

$a_global

)

prefetch_count在no_ask=false的情況下生效,即在自動應答的情況下這兩個值是不生效的

注意:如果我們有兩個進程,一個設置prefetch_count為1,一個沒有設置這個,這樣只會有一個進程會等待確認,還有一個不會等待確認,這樣容易導致不可預知的錯誤;當多個進程設置prefetch_count值時,相互之間的數據時沒有影響的;比如兩個進程都設置的是2那么總的未確認存在數是4;

basic_consume("TestQueue", "", false, false, false, false, $callback)

順序

參數名

默認值

作用

1

queue

消息要取得消息的隊列名

2

consumer_tag

消費者標簽

3

no_local

false

這個功能屬于AMQP的標準,但是rabbitMQ并沒有做實現.

4

no_ack

false

收到消息后,是否不需要回復確認即被認為被消費(在默認情況下,消息確認機制是關閉的。現在是時候開啟消息確認機制,該參數設置為true,并且工作進程處理完消息后發送確認消息。)

5

exclusive

false

排他消費者,即這個隊列只能由一個消費者消費.適用于任務不允許進行并發處理的情況下.比如系統對接

6

nowait

false

不返回執行結果,但是如果排他開啟的話,則必須需要等待結果的,如果兩個一起開就會報錯

7

callback

null

回調函數

8

ticket

null

9

arguments

null

總結

以上是生活随笔為你收集整理的callmode php_Rabbitmq各方法的作用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。