国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

為什么需要心跳檢測(cè)?

正常的情況客戶(hù)端斷開(kāi)連接會(huì)向服務(wù)端發(fā)送一個(gè)fin包,服務(wù)端收到fin包后得知客戶(hù)端連接斷開(kāi),則立刻觸發(fā)onClose事件回調(diào)。

但是有些極端情況如客戶(hù)端掉電、網(wǎng)絡(luò)關(guān)閉、拔網(wǎng)線(xiàn)、路由故障等,這些極端情況客戶(hù)端無(wú)法發(fā)送fin包給服務(wù)端,服務(wù)端便無(wú)法知道連接已經(jīng)斷開(kāi)。如果客戶(hù)端與服務(wù)端定時(shí)有心跳數(shù)據(jù)傳輸,則會(huì)比較及時(shí)的發(fā)現(xiàn)連接斷開(kāi),觸發(fā)onClose事件回調(diào)。

另外路由節(jié)點(diǎn)防火墻會(huì)關(guān)閉長(zhǎng)時(shí)間不通訊的socket連接,導(dǎo)致socket長(zhǎng)連接斷開(kāi)。所以需要客戶(hù)端與服務(wù)端定時(shí)發(fā)送心跳數(shù)據(jù)保持連接不被斷開(kāi)。

心跳檢測(cè)的原理是什么?

客戶(hù)端定時(shí)每X秒(推薦小于60秒)向服務(wù)端發(fā)送特定數(shù)據(jù)(任意數(shù)據(jù)都可),服務(wù)端設(shè)定為X秒沒(méi)有收到客戶(hù)端心跳則認(rèn)為客戶(hù)端掉線(xiàn),并關(guān)閉連接觸發(fā)onClose回調(diào)。這樣即通過(guò)心跳檢測(cè)請(qǐng)求維持了連接(避免連接因長(zhǎng)時(shí)間不活躍而被網(wǎng)關(guān)防火墻關(guān)閉),也能讓服務(wù)端比較及時(shí)的知道客戶(hù)端是否異常掉線(xiàn)。

GatewayWorker中如何配置心跳檢測(cè)?

目前GatewayWorker支持兩種心跳檢測(cè),服務(wù)端設(shè)定多少秒內(nèi)沒(méi)收到心跳關(guān)閉連接,同時(shí)也支持服務(wù)端定時(shí)向客戶(hù)端發(fā)送心跳數(shù)據(jù),推薦客戶(hù)端發(fā)送心跳,也可以?xún)煞N檢測(cè)同時(shí)開(kāi)啟。

客戶(hù)端定時(shí)發(fā)送心跳(推薦)

客戶(hù)端定時(shí)向服務(wù)端發(fā)送心跳。服務(wù)端類(lèi)似以下配置:

$gateway = new Gateway("Websocket://0.0.0.0:8585");

$gateway->pingInterval = 55;

$gateway->pingNotResponseLimit = 1;

$gateway->pingData = '';

以上配置含義是客戶(hù)端連接 pingInterval*pingNotResponseLimit=55 秒內(nèi)沒(méi)有任何數(shù)據(jù)傳輸給服務(wù)端則服務(wù)端認(rèn)為對(duì)應(yīng)客戶(hù)端已經(jīng)掉線(xiàn),服務(wù)端關(guān)閉連接并觸發(fā)onClose回調(diào)。

由于心跳是周期性檢測(cè),實(shí)際執(zhí)行onClose的時(shí)間一般會(huì)大于pingInterval*pingNotResponseLimit=55,誤差在pingInterval內(nèi)。
客戶(hù)端的心跳周期應(yīng)該要比服務(wù)端設(shè)置的$gateway->pingInterval=55小一些,例如客戶(hù)端50秒發(fā)送一段數(shù)給服務(wù)端

服務(wù)端主動(dòng)發(fā)送心跳

GatewayWorer支持服務(wù)端向客戶(hù)端發(fā)送心跳檢測(cè),可以像下面這樣設(shè)置。

$gateway = new Gateway("Websocket://0.0.0.0:8585");

$gateway->pingInterval = 55;

$gateway->pingNotResponseLimit = 0;

// 服務(wù)端定時(shí)向客戶(hù)端發(fā)送的數(shù)據(jù)
$gateway->pingData = '{"type":"ping"}';

以上服務(wù)端會(huì)定時(shí)55秒給客戶(hù)端發(fā)心跳數(shù)據(jù){"type":"ping"},而客戶(hù)端不需要定時(shí)向服務(wù)端發(fā)送心跳數(shù)據(jù)。

其中pingNotResponseLimit = 0代表服務(wù)端允許客戶(hù)端不發(fā)送心跳,服務(wù)端不會(huì)因?yàn)榭蛻?hù)端長(zhǎng)時(shí)間沒(méi)發(fā)送數(shù)據(jù)而斷開(kāi)連接。
如果pingNotResponseLimit = 1,則代表客戶(hù)端必須定時(shí)發(fā)送數(shù)據(jù)給服務(wù)端,否則pingNotResponseLimit*pingInterval=55秒內(nèi)沒(méi)有任何數(shù)據(jù)發(fā)來(lái)則關(guān)閉對(duì)應(yīng)連接,并觸發(fā)onClose。

由于心跳是周期性檢測(cè),實(shí)際執(zhí)行onClose的時(shí)間一般會(huì)大于pingInterval*pingNotResponseLimit=55,誤差在pingInterval內(nèi)。

說(shuō)明:

Gateway::$pingInterval

心跳檢測(cè)時(shí)間間隔 單位:秒。如果設(shè)置為0代表不做任何心跳檢測(cè)。

Gateway::$pingNotResponseLimit

客戶(hù)端連續(xù)$pingNotResponseLimit$pingInterval時(shí)間內(nèi)不發(fā)送任何數(shù)據(jù)(包括但不限于心跳數(shù)據(jù))則斷開(kāi)鏈接,并觸發(fā)onClose。
如果設(shè)置為0代表客戶(hù)端不用發(fā)送心跳數(shù)據(jù),即通過(guò)TCP層面檢測(cè)連接的連通性(極端情況至少10分鐘才能檢測(cè)到連接斷開(kāi),甚至可能永遠(yuǎn)檢測(cè)不到)

Gateway::$pingData

當(dāng)需要服務(wù)端定時(shí)給客戶(hù)端發(fā)送心跳數(shù)據(jù)時(shí), $gateway->pingData設(shè)置為服務(wù)端要發(fā)送的心跳請(qǐng)求數(shù)據(jù),心跳數(shù)據(jù)是任意的,只要客戶(hù)端能識(shí)別即可??蛻?hù)端收到心跳數(shù)據(jù)可以忽略不做任何處理。

注意:

當(dāng)設(shè)置為服務(wù)端主動(dòng)發(fā)送心跳時(shí),心跳間隔并不是100%精準(zhǔn)。當(dāng)客戶(hù)端連接成功后,服務(wù)端發(fā)來(lái)的第一個(gè)心跳的時(shí)間間隔可能要小于服務(wù)器設(shè)置的值。

當(dāng)設(shè)置為服務(wù)端主動(dòng)發(fā)送心跳時(shí),如果客戶(hù)端最近有發(fā)來(lái)數(shù)據(jù),那么證明客戶(hù)端存活,服務(wù)端會(huì)省略一個(gè)心跳,下個(gè)心跳大約1.5*$gateway->pingInterval秒后發(fā)送。

如果心跳是客戶(hù)端發(fā)送,$gateway->pingNotResponseLimit最好大于0,這樣可以及時(shí)檢測(cè)到一些死連接(連接已經(jīng)斷開(kāi),但是服務(wù)端不知道)

斷線(xiàn)重連(重要)

不管是客戶(hù)端發(fā)送心跳還是服務(wù)端發(fā)送心跳,連接都有斷開(kāi)的可能。例如瀏覽器最小化js被暫停、瀏覽器切換到其它tab頁(yè)面js被暫停、電腦進(jìn)入睡眠等等、移動(dòng)端切換網(wǎng)絡(luò)、信號(hào)變?nèi)酢⑹謾C(jī)黑屏、手機(jī)應(yīng)用切換到后臺(tái)、路由故障、業(yè)務(wù)主動(dòng)斷開(kāi)等。尤其是外網(wǎng)環(huán)境復(fù)雜,很多路由節(jié)點(diǎn)會(huì)清理1分鐘內(nèi)不活躍的連接,這也是為什么心跳間隔推薦小于1分鐘的原因。

連接在外網(wǎng)環(huán)境很容易被斷開(kāi),所以斷線(xiàn)重連是長(zhǎng)連接應(yīng)用必須具備的功能(斷線(xiàn)重連只能客戶(hù)端做,服務(wù)端無(wú)法實(shí)現(xiàn))。例如瀏覽器websocket需要監(jiān)聽(tīng)onclose事件,當(dāng)發(fā)生onclose時(shí)建立新的連接(為避免需崩可延建立連接)。更嚴(yán)格一點(diǎn),服務(wù)端也應(yīng)該定時(shí)發(fā)起心跳數(shù)據(jù),并且客戶(hù)端需要定時(shí)監(jiān)測(cè)服務(wù)端的心跳數(shù)據(jù)是否超時(shí),超過(guò)規(guī)定時(shí)間未收到服務(wù)端心跳數(shù)據(jù)應(yīng)該認(rèn)定連接已經(jīng)斷開(kāi),需要執(zhí)行close關(guān)閉連接,并重新建立新的連接。

編輯于2024-03-13 17:37:33 完善本頁(yè) +發(fā)起討論
贊助商