在GatewayWorker\Lib\Gateway.php 中有一些代码中有可能会抛出一些异常信息 比如
/**
* 踢掉当前客户端
*
* @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进程会停止么?
会停止。主进程会立刻fork一个新的worker进程
这种情况下 在worker进程中创建的定时器和一些全局对象是不是也就失效了?出现这种情况 一些常驻内存的业务逻辑是不是会受到影响?比如我的一个Worker就是一个房间 房间中保存的游戏数据会丢失么?
这种情况下 在worker进程中创建的定时器和一些全局对象是不是也就失效了?出现这种情况 一些常驻内存的业务逻辑是不是会受到影响?比如我的一个Worker就是一个房间 房间中保存的游戏数据会丢失么?
对,会定时器会失效。不过可以在onWorkerStart时根据你的业务逻辑重建定时器。
进程中最好保存临时数据,重要数据建议保存到mysql等存储中。
像上面贴的在异步环境中closeCurrentClient()会触发异常,这个主要是为了开发阶段方便发现问题,否则业务开发排查bug会比较困难。这种明显的错误不应该在正式的运营环境中出现,在开发或者测试阶段就应该发现。
如果需要在内存中存储一些重要数据,你的业务代码上线前必须保证没有问题,不会出现致命错误,不要指望任何框架能够避免致命错误。
谢谢你的回复!!!
不客气
@walkor 请问为何不能再 async context 关闭指定的 client?
workerman 中 async content 有哪些?
可以在异步环境关闭指定的client,但是不能用Gateway::closeCurrentClient接口,因为异步环境里关闭当前连接时无法确定谁时当前连接(onMessage里可以用这个接口Gateway::closeCurrentClient)。
异步环境里应该用Gateway::closeClient($client_id)接口,把client_id传进去,这样明确指定是关闭谁。