重启的时候调用Gateway的一些方法会报错

问题描述

每次重启的时候(无论是restart获取reload)都会导致出现 unable to connect to tcp://127.0.0.1:2306 (Connection refused) ,我大概知道是什么原因引起的,但是不知道怎么解决

比如说我在close调用getClientIdByUid ,每当我重启的时候,就会导致getClientIdByUid 调用报错,不知道该如何处理,跪求大家帮帮忙,重启的时候不仅仅onClose会报错,也会有onMessage里面调用Gateway::getUidByClientId的报错

程序代码

public static function onClose($client_id)
{
    $user_id = $_SESSION['user_id'] ?? 0;
    $exist = Gateway::getClientIdByUid($user_id);
    if (empty($exist)) {
        Db::name('user')->where('id', $user_id)->update(['is_online' => 0, 'offline_time' => datetime()]);
    }
}

报错信息

2023-05-15 22:03:12 pid:10107 ErrorException: stream_socket_client(): unable to connect to tcp://127.0.0.1:2306 (Connection refused) in /data/www/comechat_wss/vendor/workerman/gateway-worker/src/Lib/Gateway.php:761
341 2 0
2个回答

PHP武汉小老弟

给我带来的困扰是一些业务的处理可能不准,比如说当进入了onClose,我会根据$exist = Gateway::getClientIdByUid($user_id);判断用户是离线还是切换网络,如果我的重启的时候触发了onClose,虽然我能try catch这个报错,但是会影响我的逻辑判断,有什么比较好的处理方法吗

walkor

重启过程中有些进程会退出,这时候有业务处理需要进程通讯就会报错,这个报错是正常的。

如果你是更新数据库在线状态,按照你现在的方法,重启时需要考虑将数据库在线状态全部归零,否则会有数据不准确。
推荐用一个定时器定时执行Gateway::getAllUidList(),得到的结果去更新数据库,这样性能更好,结果准确。

  • PHP武汉小老弟 2023-05-16

    好的老大,老大我又提了个新问题,搜索了一些问答没有找到答案,能再帮忙解答下吗

🔝