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