# 框架入口 [TOC] AppServer是SD框架的入口类,它管理着框架启动的所有准备工作,这个类不会被Reload重载,也就是说如果修改了此类想让其生效,那么必须重新启动服务器通过Reload的方法是无法实现代码热更新的。 AppServer继承SwooleDistributedServer类,SwooleDistributedServer绝大部分的函数作为使用者来说不是很常用,接下来我们介绍些常用的方法。 ## __construct 可以在这定义自定义Loader ```php /** * 可以在这里自定义Loader,但必须是ILoader接口 * AppServer constructor. */ public function __construct() { $this->setLoader(new Loader()); parent::__construct(); } ``` ## getEventControllerName 设置默认的事件控制器名称,长连接(TCP,WS,WSS)需要配置 通过此函数可以将客户端的connect和close的回调路由到控制器中。 ```php /** * @return string */ public function getEventControllerName() { return 'AppController'; } ``` 上面代码将会将客户端的连接和断开事件路由到AppController控制器中。 >可通过Ports配置覆盖此设置 ## getConnectMethodName 设置默认的事件Connect方法名称,长连接(TCP,WS,WSS)需要配置 ```php /** * @return string */ public function getConnectMethodName() { return 'onConnect'; } ``` 客户端连接的信息会路由到AppController中onConnect方法。 如果在business.php配置中设置了前缀,控制器方法也需要包含前缀。 >可通过Ports配置覆盖此设置 ## getCloseMethodName 设置默认的事件Close方法名称,长连接(TCP,WS,WSS)需要配置 ```php /** * @return string */ public function getCloseMethodName() { return 'onClose'; } ``` 客户端关闭连接的信息会路由到AppController中onClose方法。 如果在business.php配置中设置了前缀,控制器方法也需要包含前缀。 >可通过Ports配置覆盖此设置 ## onOpenServiceInitialization 这个方法是服务器启动时第一时间调用的方法,并且内部实现了锁的操作,无论开多少个进程只会有一个进程会执行该方法,并且无论怎么reload也只会在启动时执行仅仅一次。 我们可以在这个方法内实现开服初始化的工作。 ## clearState 这个方法和onOpenServiceInitialization类似也是开服的初始化工作,但区别在于这是在服务器启动前做的操作,所以并不支持任何异步属性,如果你操作mysql只能使用pdo的方式,redis也只能使用同步扩展的方式。 ## initAsynPools 这里主要是进行异步客户端的初始化工作,onSwooleWorkerStart后会调用initAsynPools 进行客户端的初始化。开发者可以在此函数中添加自定义的客户端,比如额外的redis,额外的mysql,mqtt,httpclient等。 ```php $this->addAsynPool('GetIPAddress',new HttpClientPool($this->config,'http://int.dpool.sina.com.cn')); ``` 用法很简单通过addAsynPool添加一个署名的客户端实例。 在Controller和Model中可以通过get_instance()->getAsynPool('GetIPAddress')获取名为GetIPAddress的实例。 ## beforeSwooleStart 这里是进阶用法,熟悉swoole的开发者如果想创建自己的进程或者共享Table或者开放更多的端口,那么可以在这个函数中处理,名字表示的含义很清晰这是在swoole服务start方法之前调用的。 查看SwooleDistributedServer的beforeSwooleStart你会发现更多用法。 ```php $this->uid_fd_table = new \swoole_table(65536); $this->uid_fd_table->column('fd', \swoole_table::TYPE_INT, 8); $this->uid_fd_table->create(); ``` ## startProcess 启动用户进程,在这里可以自定义用户进程 ```php /** * 用户进程 */ public function startProcess() { parent::startProcess(); //ProcessManager::getInstance()->addProcess(MyProcess::class); } ``` ## onWebSocketHandCheck ```php /** * 可以在这验证WebSocket连接,return true代表可以握手,false代表拒绝 * @param HttpInput $httpInput * @return bool */ public function onWebSocketHandCheck(HttpInput $httpInput) { return true; } ``` ## get_instance() get_instance()是个帮助函数,他始终返回的是SwooleDistributedServer实例,可以在代码任何位置访问到。 ## 其他方法 * getMysql 获取同步mysql * getRedis 获取同步redis * sendToAllWorks 发送给所有的进程,$callStaticFuc为静态方法,会在每个进程都执行 * sendToAllAsynWorks 发送给所有的异步进程,$callStaticFuc为静态方法,会在每个进程都执行 * sendToRandomWorker 发送给随机进程 * sendToOneWorker 发送给指定进程 * isReload 是否是重载 * sendToAll 广播 * sendToUid 向uid发送消息 * pubToUid 向uid发布消息 * sendToUids 批量发送消息 * getSubMembersCountCoroutine 获取Topic的数量 * getSubMembersCoroutine 获取Topic的Member * getUidTopicsCoroutine 获取uid的所有订阅 * addSub 添加订阅 * removeSub 移除订阅 * pub 发布订阅 * addAsynPool 添加异步连接池 * getAsynPool 获取连接池 * isCluster 是否开启集群 * isConsul 是否开启Consul * kickUid 踢用户下线 * bindUid 将fd绑定到uid,uid不能为0 * unBindUid 解绑uid,链接断开自动解绑 * coroutineUidIsOnline uid是否在线 * coroutineCountOnline 获取在线人数 * coroutineGetAllUids 获取所有在线uid * stopTask 向task发送强制停止命令 * getServerAllTaskMessage 获取服务器上正在运行的Task * getBindIp 获取本机ip * getUidInfo 获取uid信息