当前位置: 首页 > 后端技术 > PHP

SwooleTcp学习

时间:2023-03-29 17:26:58 PHP

最近一直在学习Swoole,正好有个老项目(一个脚本)中有一小部分使用了Tcp协议,所以趁此机会重构了一下。场景描述:这个脚本的作用可以用一句话概括:将本地数据源推送到另一台服务器。原来的处理方式有以下几点不合理:目标服务器需要开放指定端口,这样会导致目标服务器暴露在外部,不安全。如果有多个目标服务器,会导致源代码频繁修改,不方便维护脚本。RefactoringRefactoring需要解决以下问题:当客户端连接成功后,将数据推送到客户端。当客户端断开连接时,停止向该客户端推送数据。允许多个客户端同时连接。因为数据源是不间断的,理论上只要客户端的连接没有主动断开,服务端的数据推送是不会自动停止的。最后利用Swoole的Tcp+Process实现了以上需求。核心代码如下:on("Connect",function($server,$fd){global$workers;//创建子进程$process=newswoole_process(function(swoole_process$worker)use($server,$fd){echo"ClientConnect".PHP_EOL;//todo业务逻辑...//向客户端推送消息$server->send($fd,$str);},true,0,false);//启动子进程$pid=$process->start();array_push($workers,["pid"=>$pid,"fd"=>$fd]);});/***监听数据接收事件*/$server->on("Receive",function($server,$fd),$from_id,$data){$server->send($fd,"Server:".$data);});/***监听连接关闭事件*/$server->on("Close",function($server,$fd){global$workers;foreach($workersas$worker){if($worker['fd']===$fd){//检查子进程是否存在if(Process::kill($worker['pid'],0)){array_shift($worker);//通过信号终止子进程Process::kill($worker['pid'],SIGKILL);}}}回声“客户端关闭”。PHP_EOL;});//启动TCP服务器$server->start();其实实现原理很简单,利用Swoole的基于事件的Tcp异步编程,当有客户端连接时,创建一个子进程推送数据,当客户端断开连接时,对应的子进程客户端通过信号终止