用workerman 有一段時(shí)間了 由于業(yè)務(wù)量不大 ,所以也沒(méi)有發(fā)現(xiàn)什么問(wèn)題 。
最近幾天 業(yè)務(wù)量較大 。我在后臺(tái) debug 下發(fā)現(xiàn)了兩個(gè)重要錯(cuò)誤。
一個(gè)是 在sql 查詢的時(shí)候 突然報(bào)出 my sql has gone away .
另一個(gè)是 客戶端 上去 直接說(shuō) client_id is invalide ,這個(gè) client_id 是由wm系統(tǒng) 分配的 怎么還無(wú)效了?
以上兩個(gè)問(wèn)題 分別有截屏 請(qǐng)求解答 感謝。
mysql has gone away 是由于mysql鏈接被mysql服務(wù)端斷開(kāi)導(dǎo)致的,GatewayWorker的DbConnection是有判斷這種情況,發(fā)現(xiàn)mysql has gone away會(huì)嘗試重連一次,如果重連還是失敗,則會(huì)拋出你截圖中的異常。
所以你截圖中的mysql has gone away錯(cuò)誤很可能是mysql服務(wù)端的問(wèn)題,比如mysql服務(wù)端有kill腳本定時(shí)殺死耗時(shí)mysql線程等,導(dǎo)致鏈接斷開(kāi)(這里只是比如,具體問(wèn)題還得你自己定位)。
第二個(gè)錯(cuò)誤closeClient你傳了個(gè)空的client_id過(guò)去,所以會(huì)報(bào)錯(cuò)。
Context.php源碼中異常部分代碼如下
if (strlen($client_id) !== 20) {
throw new Exception("client_id $client_id is invalid");
}
你的異常消息是 client_id is invalid
,可以看出$client_id傳了個(gè)空,調(diào)用棧都有,可以自行打日志看下。
我看到 長(zhǎng)連接的mysql 服務(wù)端 在長(zhǎng)時(shí)間 收不到請(qǐng)求的情況 會(huì)主動(dòng)斷來(lái)連接。 那么我在使用的時(shí)候是按手冊(cè)里提供的方法 $sql_r=Db::instance('ms')->select('money,tableNum')->from('msr_info')->where("msrId='$search_mid'")->row(); 來(lái)獵取數(shù)據(jù)的 這個(gè)語(yǔ)句不知道 底層有沒(méi)有實(shí)現(xiàn)關(guān)閉? 如果沒(méi)有 我需要調(diào)什么語(yǔ)句關(guān)閉?手冊(cè)里沒(méi)有找到。
你的調(diào)用棧里面打印的出來(lái)了,是你在msgController::cutClient里面調(diào)用Gateway::closeClient,Gateway::closeClient傳錯(cuò)了參數(shù)。