无限重连问题

2007lf
$worker = new Worker();

$worker->onWorkerStart = function ($worker) {

    //a客户端
    $con = new AsyncTcpConnection('ws:/aaa.com');
    $con->onConnect = function ($con) {
        echo '=连接=';
        $con->lastMessageTime = time();

        //心跳
        $time_interval = 5;
        $con->timer_id = Timer::add($time_interval, function () use ($con) {
            $stamp = time();
            //断线重连
            if (($stamp - $con->lastMessageTime) > 7) {
                echo '=断线重连=';
                Timer::del($con->timer_id);
                $con->close();
            } else {
                $con->send('{"ping": '. $stamp .'}');
            }
        });
    };

    $con->onMessage = function ($con, $data) {
        $data = json_decode($data, true);
        if (isset($data)) {
            $con->lastMessageTime = $data;
            return;
        }
    };

    $con->onClose = function ($con) {
        echo '=关闭=';
        if (isset($con->timer_id)) {
            Timer::del($con->timer_id);
        }
        $con->reConnect(2);
    };

    $con->connect();

    //b客户端
    $cons = new AsyncTcpConnection('ws:/bbb.com');
    $cons->onConnect = function ($cons) {
        echo '=连接s=';
        $cons->lastMessageTime = time();

        //心跳
        $time_interval = 5;
        $cons->timer_id = Timer::add($time_interval, function () use ($cons) {
            $stamp = time();
            //断线重连
            if (($stamp - $cons->lastMessageTime) > 7) {
                echo '=断线重连s=';
                Timer::del($cons->timer_id);
                $cons->close();
            } else {
                $cons->send('{"ping": '. $stamp .'}');
            }
        });
    };

    $cons->onMessage = function ($cons, $data) {
        $data = json_decode($data, true);
        if (isset($data)) {
            $cons->lastMessageTime = $data;
            return;
        }
    };

    $cons->onClose = function ($cons) {
        echo '=关闭s=';
        if (isset($cons->timer_id)) {
            Timer::del($cons->timer_id);
        }
        $cons->reConnect(2);
    };

    $cons->connect();
};

Worker::runAll();

运行一段时候,会出现下图中的无限断线重连问题,客户端a和b都有出现过这个问题,实在想不通,求助
 

2875 4 0
4个回答

phpcreeper

1、if ($stamp - $cons->lastMessageTime) > 7,  定时器第二次执行的时候肯定满足这个条件了;
2、另外根据场景:$con->lastMessageTime = time(); 应该改为:
empty($con->lastMessageTime) && $con->lastMessageTime = time();

  • 2007lf 2019-06-01

    只有两次ping都没有pong返回才会触发重连,重新连接就是要初始化lastMessageTime啊,不然会一直触发重连

walkor 打赏

更新到最新版本3.5.19试下,3.5.19版本优化了下重连问题

  • 2007lf 2019-06-01

    是这个最新版本,你也看不出问题在哪吗?[捂脸哭]

  • walkor 2019-06-02

    3.5.19之前的版本 asnycTcpConnection使用ws协议时,重连握手通讯时数据可能会被业务send的数据扰乱导致重连失败,3.5.19解决了这个问题,你可以试下

  • 2007lf 2019-06-02

    @1:我用的就是这个版本,不过我对比了最新的,只有一点差距,是这个因素吗,下图

2007lf

[attach]2075[/attach]
Workerman-3.5.19/Worker.php

2007lf

最近又出现无限重连的情况,中间有段时候稳定了很久,非常奇怪,=连接s= 中,没有断的情况,又来了=连接s=,然后就无限重连,=连接= 都正常,就我上面这种多个客户端放到一个进程中是否合理?@walkor 请教帮助,谢谢!

年代过于久远,无法发表回答
×
🔝