关于my sql has goen away 与 client_id is invalide 这两个今天出现的错误

weoweo520

用workerman 有一段时间了 由于业务量不大 ,所以也没有发现什么问题 。
最近几天 业务量较大 。我在后台 debug 下发现了两个重要错误。

一个是 在sql 查询的时候 突然报出 my sql has gone away .

另一个是 客户端 上去 直接说 client_id is invalide ,这个 client_id 是由wm系统 分配的 怎么还无效了?

以上两个问题 分别有截屏 请求解答 感谢。

3278 3 0
3个回答

walkor

mysql has gone away 是由于mysql链接被mysql服务端断开导致的,GatewayWorker的DbConnection是有判断这种情况,发现mysql has gone away会尝试重连一次,如果重连还是失败,则会抛出你截图中的异常。
所以你截图中的mysql has gone away错误很可能是mysql服务端的问题,比如mysql服务端有kill脚本定时杀死耗时mysql线程等,导致链接断开(这里只是比如,具体问题还得你自己定位)。

第二个错误closeClient你传了个空的client_id过去,所以会报错。
Context.php源码中异常部分代码如下

    if (strlen($client_id) !== 20) {
        throw new Exception("client_id $client_id is invalid");
    }

你的异常消息是 client_id is invalid,可以看出$client_id传了个空,调用栈都有,可以自行打日志看下。

  • weoweo520 2016-08-08

    我看到 长连接的mysql 服务端 在长时间 收不到请求的情况 会主动断来连接。 那么我在使用的时候是按手册里提供的方法 $sql_r=Db::instance('ms')->select('money,tableNum')->from('msr_info')->where("msrId='$search_mid'")->row(); 来猎取数据的 这个语句不知道 底层有没有实现关闭? 如果没有 我需要调什么语句关闭?手册里没有找到。

weoweo520

“第二个错误closeClient你传了个空的client_id过去,所以会报错。”

问题是 这个 client_id 不是我代码中传的啊 ,这个client_id是gateAWay 框架中实现 的部分。

为什么会传空过去呢? 这个修改我的代码能解决问题吗?

  • weoweo520 2016-07-24

    已懂了 这个地方 还真是我传进去的了。 谢谢

latin

你的调用栈里面打印的出来了,是你在msgController::cutClient里面调用Gateway::closeClient,Gateway::closeClient传错了参数。

  • 暂无评论
年代过于久远,无法发表回答
🔝