在GatewayWorker\Lib\Gateway.php 中有一些代碼中有可能會(huì)拋出一些異常信息 比如
/**
* 踢掉當(dāng)前客戶端
*
* @return bool
* @throws Exception
*/
public static function closeCurrentClient()
{
if (!Context::$connection_id) {
throw new Exception('closeCurrentClient can not be called in async context');
}
return self::kickAddress(long2ip(Context::$local_ip) . ':' . Context::$local_port, Context::$connection_id);
}
假如真的拋出了異常的情況下,worker進(jìn)程會(huì)停止么?
會(huì)停止。主進(jìn)程會(huì)立刻fork一個(gè)新的worker進(jìn)程
這種情況下 在worker進(jìn)程中創(chuàng)建的定時(shí)器和一些全局對(duì)象是不是也就失效了?出現(xiàn)這種情況 一些常駐內(nèi)存的業(yè)務(wù)邏輯是不是會(huì)受到影響?比如我的一個(gè)Worker就是一個(gè)房間 房間中保存的游戲數(shù)據(jù)會(huì)丟失么?
這種情況下 在worker進(jìn)程中創(chuàng)建的定時(shí)器和一些全局對(duì)象是不是也就失效了?出現(xiàn)這種情況 一些常駐內(nèi)存的業(yè)務(wù)邏輯是不是會(huì)受到影響?比如我的一個(gè)Worker就是一個(gè)房間 房間中保存的游戲數(shù)據(jù)會(huì)丟失么?
對(duì),會(huì)定時(shí)器會(huì)失效。不過(guò)可以在onWorkerStart時(shí)根據(jù)你的業(yè)務(wù)邏輯重建定時(shí)器。
進(jìn)程中最好保存臨時(shí)數(shù)據(jù),重要數(shù)據(jù)建議保存到mysql等存儲(chǔ)中。
像上面貼的在異步環(huán)境中closeCurrentClient()會(huì)觸發(fā)異常,這個(gè)主要是為了開(kāi)發(fā)階段方便發(fā)現(xiàn)問(wèn)題,否則業(yè)務(wù)開(kāi)發(fā)排查bug會(huì)比較困難。這種明顯的錯(cuò)誤不應(yīng)該在正式的運(yùn)營(yíng)環(huán)境中出現(xiàn),在開(kāi)發(fā)或者測(cè)試階段就應(yīng)該發(fā)現(xiàn)。
如果需要在內(nèi)存中存儲(chǔ)一些重要數(shù)據(jù),你的業(yè)務(wù)代碼上線前必須保證沒(méi)有問(wèn)題,不會(huì)出現(xiàn)致命錯(cuò)誤,不要指望任何框架能夠避免致命錯(cuò)誤。
@walkor 請(qǐng)問(wèn)為何不能再 async context 關(guān)閉指定的 client?
workerman 中 async content 有哪些?
可以在異步環(huán)境關(guān)閉指定的client,但是不能用Gateway::closeCurrentClient接口,因?yàn)楫惒江h(huán)境里關(guān)閉當(dāng)前連接時(shí)無(wú)法確定誰(shuí)時(shí)當(dāng)前連接(onMessage里可以用這個(gè)接口Gateway::closeCurrentClient)。
異步環(huán)境里應(yīng)該用Gateway::closeClient($client_id)接口,把client_id傳進(jìn)去,這樣明確指定是關(guān)閉誰(shuí)。