在GatewayWorker\Lib\Gateway.php 中有一些代碼中有可能會拋出一些異常信息 比如
/**
* 踢掉當(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)程會停止么?
這種情況下 在worker進(jìn)程中創(chuàng)建的定時器和一些全局對象是不是也就失效了?出現(xiàn)這種情況 一些常駐內(nèi)存的業(yè)務(wù)邏輯是不是會受到影響?比如我的一個Worker就是一個房間 房間中保存的游戲數(shù)據(jù)會丟失么?
對,會定時器會失效。不過可以在onWorkerStart時根據(jù)你的業(yè)務(wù)邏輯重建定時器。
進(jìn)程中最好保存臨時數(shù)據(jù),重要數(shù)據(jù)建議保存到mysql等存儲中。
像上面貼的在異步環(huán)境中closeCurrentClient()會觸發(fā)異常,這個主要是為了開發(fā)階段方便發(fā)現(xiàn)問題,否則業(yè)務(wù)開發(fā)排查bug會比較困難。這種明顯的錯誤不應(yīng)該在正式的運營環(huán)境中出現(xiàn),在開發(fā)或者測試階段就應(yīng)該發(fā)現(xiàn)。
如果需要在內(nèi)存中存儲一些重要數(shù)據(jù),你的業(yè)務(wù)代碼上線前必須保證沒有問題,不會出現(xiàn)致命錯誤,不要指望任何框架能夠避免致命錯誤。
@walkor 請問為何不能再 async context 關(guān)閉指定的 client?
workerman 中 async content 有哪些?