源码问题求教!!!!!

我心飞扬

在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进程会停止么?

阅读 1506
7个回答

walkor

会停止。主进程会立刻fork一个新的worker进程

  • 我心飞扬 2016-09-22

    这种情况下 在worker进程中创建的定时器和一些全局对象是不是也就失效了?出现这种情况 一些常驻内存的业务逻辑是不是会受到影响?比如我的一个Worker就是一个房间 房间中保存的游戏数据会丢失么?

我心飞扬

这种情况下 在worker进程中创建的定时器和一些全局对象是不是也就失效了?出现这种情况 一些常驻内存的业务逻辑是不是会受到影响?比如我的一个Worker就是一个房间 房间中保存的游戏数据会丢失么?

  • 暂无评论
walkor

对,会定时器会失效。不过可以在onWorkerStart时根据你的业务逻辑重建定时器。
进程中最好保存临时数据,重要数据建议保存到mysql等存储中。

像上面贴的在异步环境中closeCurrentClient()会触发异常,这个主要是为了开发阶段方便发现问题,否则业务开发排查bug会比较困难。这种明显的错误不应该在正式的运营环境中出现,在开发或者测试阶段就应该发现。

如果需要在内存中存储一些重要数据,你的业务代码上线前必须保证没有问题,不会出现致命错误,不要指望任何框架能够避免致命错误。

  • 暂无评论
我心飞扬

谢谢你的回复!!!

  • 暂无评论
walkor

不客气

  • 暂无评论
aidong_wang

@walkor 请问为何不能再 async context 关闭指定的 client?
workerman 中 async content 有哪些?

  • 暂无评论
walkor

可以在异步环境关闭指定的client,但是不能用Gateway::closeCurrentClient接口,因为异步环境里关闭当前连接时无法确定谁时当前连接(onMessage里可以用这个接口Gateway::closeCurrentClient)。
异步环境里应该用Gateway::closeClient($client_id)接口,把client_id传进去,这样明确指定是关闭谁。

  • 暂无评论