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

workerman怎么加心跳,判斷哪個沒有回復(fù),然后斷開指定的客戶端

luck橙

就是怎么指定斷開某個連接我給個uid

3911 2 0
2個回答

damao

注意:長連接應(yīng)用必須加心跳,否則連接可能由于長時間未通訊被路由節(jié)點強(qiáng)行斷開。

心跳作用主要有兩個:
1、客戶端定時給服務(wù)端發(fā)送點數(shù)據(jù),防止連接由于長時間沒有通訊而被某些節(jié)點的防火墻關(guān)閉導(dǎo)致連接斷開的情況。
2、服務(wù)端可以通過心跳來判斷客戶端是否在線,如果客戶端在規(guī)定時間內(nèi)沒有發(fā)來任何數(shù)據(jù),就認(rèn)為客戶端下線。這樣可以檢測到客戶端由于極端情況(斷電、斷網(wǎng)等)下線的事件。

心跳間隔建議值:
建議客戶端發(fā)送心跳間隔小于60秒,比如55秒。

<?php
require_once __DIR__ . '/Workerman/Autoloader.php';
use Workerman\Worker;
use Workerman\Lib\Timer;

// 心跳間隔55秒
define('HEARTBEAT_TIME', 55);

$worker = new Worker('text://0.0.0.0:1234');

$worker->onMessage = function($connection, $msg) {
    // 給connection臨時設(shè)置一個lastMessageTime屬性,用來記錄上次收到消息的時間
    $connection->lastMessageTime = time();
    // 其它業(yè)務(wù)邏輯...
};

// 進(jìn)程啟動后設(shè)置一個每秒運(yùn)行一次的定時器
$worker->onWorkerStart = function($worker) {
    Timer::add(1, function()use($worker){
        $time_now = time();
        foreach($worker->connections as $connection) {
            // 有可能該connection還沒收到過消息,則lastMessageTime設(shè)置為當(dāng)前時間
            if (empty($connection->lastMessageTime)) {
                $connection->lastMessageTime = $time_now;
                continue;
            }
            // 上次通訊時間間隔大于心跳間隔,則認(rèn)為客戶端已經(jīng)下線,關(guān)閉連接
            if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
                $connection->close();
            }
        }
    });
};

Worker::runAll();

手冊抄來的。
http://doc.workerman.net/faq/heartbeat.html

  • 暫無評論
luck橙

但是我要怎么判斷是哪個客戶端沒有給我發(fā)呢,然后斷開,我的寫法是這樣的,請問要怎么加心跳呢

<?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
// 初始化一個worker容器,監(jiān)聽1234端口
$worker = new Worker('websocket://0.0.0.0:1234');//

/*
 * 注意這里進(jìn)程數(shù)必須設(shè)置為1,否則會報端口占用錯誤
 * (php 7可以設(shè)置進(jìn)程數(shù)大于1,前提是$inner_text_worker->reusePort=true)
 */
$worker->count = 1;
// worker進(jìn)程啟動后創(chuàng)建一個text Worker以便打開一個內(nèi)部通訊端口
$worker->onWorkerStart = function($worker)
{
    // 開啟一個內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式 文本+換行符
    $inner_text_worker = new Worker('text://0.0.0.0:5678');
    $inner_text_worker->onMessage = function($connection, $buffer)
    {
        // $data數(shù)組格式,里面有uid,表示向那個uid的頁面推送數(shù)據(jù)
        $data = json_decode($buffer, true);
        $uid = $data['uid'];
        // 通過workerman,向uid的頁面推送數(shù)據(jù)
        $ret = sendMessageByUid($uid, $buffer);
        // 返回推送結(jié)果
        $connection->send($ret ? 'ok' : 'fail');
    };
    // ## 執(zhí)行監(jiān)聽 ##
    $inner_text_worker->listen();
};
// 新增加一個屬性,用來保存uid到connection的映射
$worker->uidConnections = array();
// 當(dāng)有客戶端發(fā)來消息時執(zhí)行的回調(diào)函數(shù)
$worker->onMessage = function($connection, $data)
{
    global $worker;
    // 判斷當(dāng)前客戶端是否已經(jīng)驗證,既是否設(shè)置了uid
    if(!isset($connection->uid))
    {
       // 沒驗證的話把第一個包當(dāng)做uid(這里為了方便演示,沒做真正的驗證)
       $connection->uid = $data;
       /* 保存uid到connection的映射,這樣可以方便的通過uid查找connection,
        * 實現(xiàn)針對特定uid推送數(shù)據(jù)
        */
       $worker->uidConnections[$connection->uid] = $connection;
       return;
    }
};

// 當(dāng)有客戶端連接斷開時
$worker->onClose = function($connection)
{
    global $worker;
    if(isset($connection->uid))
    {
        // 連接斷開時刪除映射
        unset($worker->uidConnections[$connection->uid]);
    }
};

// 向所有驗證的用戶推送數(shù)據(jù)
function broadcast($message)
{
   global $worker;
   foreach($worker->uidConnections as $connection)
   {
        $connection->send($message);
   }
}

// 針對uid推送數(shù)據(jù)
function sendMessageByUid($uid, $message)
{
    global $worker;
    if(isset($worker->uidConnections[$uid]))
    {
        $connection = $worker->uidConnections[$uid];
        $connection->send($message);
        return true;
    }
    return false;
}
  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表回答
??