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

使用swoole快速搭建推送服务器

时间:2023-03-29 20:52:03 PHP

环境php5.6+swoole扩展需求实现简单广播,支持认证源码废话,上传代码。host=$host;$this->port=$port;$this->config=$config;$this->初始化();}publicfunctioninit(){$this->server=newServer($this->host,$this->port);!empty($this->config)&&$this->server->set($this->config);$this->beforeSendMsgCallback=function(){};$this->afterSendMsgCallback=函数(){};$this->beforeAuthCallback=function(){};$this->afterAuthCallback=function(){};$this->authenticator=function(){};$this->bindEvents();}publicfunctionbindEvents(){$this->server->on('open',[$this,'onOpen']);$this->server->on('message',[$this,'onMessage']);$this->server->on('close',[$this,'onClose']);}publicfunctionrun(){$this->server->start();}publicfunctiononOpen(Server$server,$request){call_user_func($this->beforeAuthCallback,$server,$request);如果(!$this->auth($request)){返回;$this->customers[]=$request->fd;call_user_func($this->afterAuthCallback,$server,$request);}publicfunctiononMessage(Server$server,$frame){call_user_func($this->beforeSendMsgCallback,$server,$frame);$this->broadcast($frame->fd,$frame->data);call_user_func($this->afterSendMsgCallback,$server,$frame);}publicfunctiononClose($ser,$fd){$key=array_search($fd,$this->customers);取消设置($this->客户[$key]);}公共函数__call($method,$params){$class_name=get_class($this->server);$class=newReflectionClass($class_name);尝试{$class->getMethod($method);}catch(ReflectionException$e){echo"方法$method不存在\n";返回;}call_user_func_array([$this->server,$method],$params);}publicfunctionbroadcast($fromUser,$messages){$users=array_diff($this->customers,[$fromUser]);foreach($usersas$user){$this->server->push($user,$messages);}}私有函数auth($request){如果(($结果=call_user_func($this->authenticator,$request))===false){$this->server->push($request->fd,"authfailed");$this->server->close($request->fd);}返回$结果;}}使用示例1,]);$server->authenticator=function($request)使用($server){$get=$request->get;返回空($get)||($get['access_token']=='access_token');};$server->afterAuthCallback=function($ser,$request)使用($server){$server->push($request->fd,"授权成功");};$server->run();phpindex.php#客户端js代码会作为守护进程运行:varwebsocket=newWebSocket("ws://192.168.2.106:9501?access_token=access_token");websocket.onopen=function(evt){};websocket.onmessage=function(evt){console.log(evt);};websocket.onclose=function(evt){console.log(evt);};施工过程非常方便实现比较简单,但可以满足一般需求。支持身份验证功能,验证失败自动踢出。