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

定時器覆蓋問題

netslang

public function onMessage($connection, $data)
{
global $worker;
$connection->lastMessageTime = time();
$data = json_decode($data, true);
$_SESSION['hotel_price'] = '';
switch($data['type']){
case 'login':
$where['id'] = $data['id'];
$where['token'] = $data['token'];
$id = Db::name('business')->where($where)->value('id');
if($id){
$connection->uid = $id;//設置當前客戶端id
$worker->uidConnections[$connection->uid] = $connection;//保存到服務器里
$connection->send('{"type":"login","msg":"登錄成功"}');
$timer = new Timer();
$connection->timer_id = $timer->add('10',function()use($connection,$data){
$connection->send('{"type":"ping"}');
});
}else{
$connection->timer_id = '';
$connection->uid = $data['id'].$data['token'];
$worker->uidConnections[$connection->uid] = $connection;//保存到服務器里
$connection->send('{"type":"login","msg":"登錄失敗"}');
$connection->close();
}
break;
}
}

如果用戶多點了一次login的話 定時器就會形成兩個ping到客戶端了 各位大神 怎么解決?

2711 1 0
1個回答

taozywu

首先你需要多看下文檔,定時器不建議寫在onMessage回調(diào)。

從你代碼中大致得出定時器主要做一件事:那就是心跳檢測。

如下為大概示例:

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

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

$worker->onWorkerStart = function($worker) {
    // 防止開多進程
    if ($worker->id === 0) {
        Timer::add(10, function()use($worker) {
            foreach($worker->connections as $connection) {
                $connection->send('{"type":"ping"}');
            }
        });
    }
};
?
$worker->onConnect = function($connection) {
};

$worker->onMessage = function($connection, $data) {
    global $worker;
    $connection->lastMessageTime = time();
    $data = json_decode($data, true);
    $_SESSION['hotel_price'] = '';
    switch ($data['type']) {
        case 'login':
            $where['id'] = $data['id'];
            $where['token'] = $data['token'];
            $id = Db::name('business')->where($where)->value('id');
            if ($id) {
                $connection->uid = $id; //設置當前客戶端id
                $worker->uidConnections[$connection->uid] = $connection; //保存到服務器里
                $connection->send('{"type":"login","msg":"登錄成功"}');
            } else {
                $connection->timer_id = '';
                $connection->uid = $data['id'] . $data['token'];
                $worker->uidConnections[$connection->uid] = $connection; //保存到服務器里
                $connection->send('{"type":"login","msg":"登錄失敗"}');
                $connection->close();
            }
            break;
    }
};

// 如果不是在根目錄啟動,則運行runAll方法
if(!defined('GLOBAL_START')) {
    Worker::runAll();
}
  • netslang 2020-08-27

    如果不放到onMessage里,那用戶send驗證賬戶密碼怎么做,驗證登錄密碼后 我們要實時返回數(shù)據(jù)給用戶呢,我現(xiàn)在的情況是 可能用戶多點了一次login 我們的服務器會返回兩次數(shù)據(jù),重復了 怎么樣避免這樣的問題呢?

  • taozywu 2020-08-27

    if($success) {
    $connection->send(json);
    }
    類似這樣就行了。

  • netslang 2020-08-27

    @753: 我們會定時返回數(shù)據(jù)給用戶呢? 比如有消息回來我們要推給用戶撒 推給用戶的同時必須要這個用戶是登錄成功的

  • taozywu 2020-08-31

    @7358:onMessage 綁定好用戶bindUid。然后在定時器通過判斷獲取到然后sendToUid

  • taozywu 2020-08-31

    @7358:可以把數(shù)據(jù)保存在redis中,在定時器中讀取一下。

年代過于久遠,無法發(fā)表回答
??