业务后台是一款游戏配对app。PHP使用swoole创建websockets提供游戏匹配服务。匹配过程如下。区块也需要热更新,开启事件处理)匹配成功返回数据,关闭连接后,nodejs提供服务,达到匹配业务逻辑代码更改时自动加热的目的,无需重启服务更新代码官方文档关于热更新swoole的核心是你要热更新的代码必须在onWorkerStart事件中引入安装swoole和inotify绘制的“设计图”。如果使用artisan启动swoole服务,可能会导致热更新失败。因为在onWorkerStart中,之前加载了过多类的索引设置常量,实例化MatchServer启动服务require'MatchServer.php';if(php_sapi_name()!='cli')die('请使用cli方式启动');define('ROOT_PATH',dirname(dirname(dirname(__DIR__))).'/');define('PORT',20005);$server=newMatchServer();MatchServerclassMatchServer{private$server;受保护的$应用程序;function__construct(){//创建swoole_table用于进程间数据共享$table=newswoole_table(1024);$table->column('fd',swoole_table::TYPE_INT);$table->column('uid',swoole_table::TYPE_INT);$table->column('游戏类型',swoole_table::TYPE_STRING,256);$table->column('数据',swoole_table::TYPE_STRING,256);$表->创建();$this->server=newswoole_websocket_server("0.0.0.0",PORT);$this->server->table=$table;//注册回调事件$this->server->on('handShake',array($this,'onHandShake'));$this->server->on('workerStart',array($this,'onWorkerStart'));$this->server->on('open',array($this,'onOpen'));$this->server->on('message',array($this,'onMessage'));$this->server->on('close',array($this,'onClose'));$this->server->start();}/***处理握手**@paramswoole_http_request$request*@paramswoole_http_response$response**@returnbool*/publicfunctiononHandShake(\swoole_http_request$request,\swoole_http_response$response){if(参数验证失败){$响应->结束();返回假;}//swoole握手链接,因为我的匹配是在open事件中处理的,当since握手处理完成后不会自动调用open事件,需要自己调用//握手链接的代码..太多了..考虑到篇幅问题就不贴了..各位可以去swoole手册中搜索$this->onOpen($this->server,$request);返回真;}/***加载框架入口文件,并设置inotify热更新目录**@param$server*@param$worker_id*/publicfunctiononWorkerStart($server,$worker_id){//加载框架入口文件requireROOT_PATH.'public/index.php';//实例化业务逻辑类$this->application=newMatchApplication();if($worker_id==0){//设置热更新目录$dir=app_path('Game/Match');$列表[]=$目录;foreach(array_diff(scandir($dir),array('.','..'))as$item){$list[]=$dir.'/'.$item;}$notify=inotify_init();foreach($listas$item){inotify_add_watch($notify,$item,IN_CREATE|IN_DELETE|IN_MODIFY);}swoole_event_add($notify,函数()使用($notify,$server){$events=inotify_read($notify);if(!empty($events)){//执行swollereload$server->reload();}});}}/***进程匹配**@param$server*@param$request*/publicfunctiononOpen($server,$request){//调用业务逻辑类的onOpen$this->application->onOpen($服务器,$请求);}publicfunctiononMessage($server,$frame){}/***关闭连接并删除swoole_table数据**@param$server*@param$fd*/publicfunctiononClose($server,$fd){//因为我的进程间共享数据使用的swoole_table,连接关闭,需要删除数据if($server->table->exist($fd)){$server->table->del($fd);}}}MatchApplication/***处理匹配业务逻辑**@param$server*@param$request*/publicfunctiononOpen($server,$request){$fd=$request->fd;//处理业务逻辑...$server->push($fd,$data);$server->close($fd);}启动服务$phpIndex.php在onWorkerStart之前确认你要更新的代码没有加载publicfunctiononWorkerStart($server,$worker_id){print_r(get_included_files());return;}关于守卫,更多学习内容我用supervisor访问【可比大厂】优质PHP架构师教程目录,只要看了保证薪水更上一层楼(持续更新中),以上内容希望对大家有所帮助,很多PHPer在进阶的时候总会遇到一些问题和难题,业务代码写多了没有方向感。我不知道从哪里开始改进。我整理了一些这方面的资料,包括但不限于:分布式架构、高扩展、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本,Docker,微服务,Nginx等知识点需要进阶干货的可以免费分享给你,需要的可以点击链接领取进阶PHP月薪30k>>>架构师成长之路【免费访问视频和采访文件]
