用workerman 有一段时间了 由于业务量不大 ,所以也没有发现什么问题 。 最近几天 业务量较大 。我在后台 debug 下发现了两个重要错误。
一个是 在sql 查询的时候 突然报出 my sql has gone away .
另一个是 客户端 上去 直接说 client_id is invalide ,这个 client_id 是由wm系统 分配的 怎么还无效了?
以上两个问题 分别有截屏 请求解答 感谢。
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传了个空,调用栈都有,可以自行打日志看下。
client_id is invalid
我看到 长连接的mysql 服务端 在长时间 收不到请求的情况 会主动断来连接。 那么我在使用的时候是按手册里提供的方法 $sql_r=Db::instance('ms')->select('money,tableNum')->from('msr_info')->where("msrId='$search_mid'")->row(); 来猎取数据的 这个语句不知道 底层有没有实现关闭? 如果没有 我需要调什么语句关闭?手册里没有找到。
“第二个错误closeClient你传了个空的client_id过去,所以会报错。”
问题是 这个 client_id 不是我代码中传的啊 ,这个client_id是gateAWay 框架中实现 的部分。
为什么会传空过去呢? 这个修改我的代码能解决问题吗?
已懂了 这个地方 还真是我传进去的了。 谢谢
你的调用栈里面打印的出来了,是你在msgController::cutClient里面调用Gateway::closeClient,Gateway::closeClient传错了参数。
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源码中异常部分代码如下
你的异常消息是
client_id is invalid
,可以看出$client_id传了个空,调用栈都有,可以自行打日志看下。我看到 长连接的mysql 服务端 在长时间 收不到请求的情况 会主动断来连接。 那么我在使用的时候是按手册里提供的方法 $sql_r=Db::instance('ms')->select('money,tableNum')->from('msr_info')->where("msrId='$search_mid'")->row(); 来猎取数据的 这个语句不知道 底层有没有实现关闭? 如果没有 我需要调什么语句关闭?手册里没有找到。
“第二个错误closeClient你传了个空的client_id过去,所以会报错。”
问题是 这个 client_id 不是我代码中传的啊 ,这个client_id是gateAWay 框架中实现 的部分。
为什么会传空过去呢? 这个修改我的代码能解决问题吗?
已懂了 这个地方 还真是我传进去的了。 谢谢
你的调用栈里面打印的出来了,是你在msgController::cutClient里面调用Gateway::closeClient,Gateway::closeClient传错了参数。