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

在webSocket介绍服务端(PHP)的

时间:2023-03-29 18:47:27 PHP

之前,我们已经简单了解了websocket的使用。简单使用:https://www.wj0511.com/site/detail.html?id=248如果需要使用websocket,php需要安装swoole扩展。安装swoole扩展,可以参考windows下安装swoole扩展:https://www.wj0511.com/site/detail.html?id=246linux下安装swoole扩展:https://www.wj0511.com/site/detail.html?id=247这里详细说明websocket在服务端需要用到的方法和属性1:创建websocket服务端对象在使用websocket之前,首先需要创建一个websocket服务端对象$server=new\swoole_websocket_server($host,$port);参数说明:$host:websocket需要监听的IP,0.0.0.0表示监听所有IP地址$port:websocket需要监听的端口号按照上面的例子:$server=new\swoole_websocket_server('0.0.0.0','8888');上面代码的意思是创建一个websocketserver对象并监听0.0.0.0:88882:设置运行参数创建websocketserver对象之后,我们就可以设置websocket运行时的参数了,这时候使用set方法$server->设置(数组$设置);参数说明:$server:创建websocket服务器对象返回的对象$setting:运行websocket的各种参数,$setting是一个数组参数常用的运行参数有:1:事件处理线程数(reactor_num)'reactor_num'=>2,//通过该参数调整主进程的事件处理线程数,以充分利用多核。默认情况下,将启用相同数量的CPU内核。一般设置为CPU核数的1-4倍2:设置启动的Worker进程数(worker_num)'worker_num'=>4,//如果业务代码是全异步非阻塞的,设置为1-4倍CPU最合理,如果业务代码同步阻塞,需要根据请求响应时间和系统负载进行调整3:设置worker进程的最大任务数(max_request)'max_request'=>50,//该参数表示工作进程处理完n个请求后结束运行。并重新创建一个工作进程。该选项用于防止worker进程内存溢出4:Setthemaximumnumberofconnectionsallowed(max_connection)'max_connection'=>1000,//该参数用于设置Server允许的最大TCP连接数。超过此数量后,新的传入连接将被拒绝。5:包分发模式(dispatch_mode)'dispatch_mode'=>1,//1均等分发,2按FD取模固定分发,3抢占式分发,默认取Mode(dispatch=2)6:当dispatch_mode参数设置为1和3,系统会默认关闭onConnect/onClose事件。如果需要onConnect/onClose事件,需要设置enable_unsafe_event为true'enable\_unsafe\_event'=>true,7:日志文件路径(log_file)'log_file'=>'/data/log/swoole.log',//指定swoole错误日志文件地址,默认错误日志会打印到页面8:设置websocket错误日志打印级别(log_level),范围是0-5'log_level'=>1,//低于log_level设置的日志信息不会被抛出9:进程的PID存储文件地址(pid_file)'pid_file'=>'/data/log/server.pid',10:启动TCP-Keepalive死连接检测(open_tcp_keepalive)'open\_tcp\_keepalive'=>111:如果指定秒内没有数据,请检测此连接(tcp_keepidle)'tcp_keepidle'=>5,12:超过指定探测次数,关闭此连接(tcp_keepcount)'tcp_keepcount'=>5,13:设置探测的间隔事件,单位秒(tcp_keepinterval)'tcp_keepinterval'=>314:心跳检测机制(1)heartbeat_check_interval'heartbeat_check_interval'=>5,//心跳检测,该选项表示多久循环一次,以秒为单位(2)heartbeat_idle_time'heartbeat_idle_time'=>15,//心跳检测,连接最大允许空闲时间为15:守护进程(daemonize)'daemonize'=>1,//一般情况下,websocket脚本执行时,会在命令行显示正在运行的进程。当该参数设置为1时,websocket脚本将被转移到后台并作为守护进程运行。以上是一些常用的websocket运行参数,使用set方法设置运行参数。一个简单的例子如下$server->set(['max_request'=>50,]);如果不想自己设置运行参数,不需要使用set方法,那么系统会使用默认的运行参数3:注册websocket事件的回调函数在websocket中,我们可以使用on方法注册指定事件的回调函数$server->on(string$event,mixed$callback);参数说明:$server:创建websocket服务器对象返回的对象$event:需要注册的事件名称,该参数需要去掉事件名称前面的on字符$callback:PHP函数callback,可以是一串函数名,类静态方法,对象方法数组,匿名函数常见的事件有:1:onStart:websocket启动后的事件,在onStart回调中,只有echo,printLog,modifyprocess名字是允许的不要执行其他操作如:$server->on('start',function($server){echo'serverstart';echo"\n";echo'websocketprocessIDis'.$server->master_pid;});2:onHandShake:握手事件在WebSocket连接建立后执行。WebSocket服务器有一个内置的握手事件。如果用户想自己处理握手过程,可以设置onHandShake事件回调函数。这里要注意,如果你设置了握手事件,那么你将不再触发onOpen事件。这时候需要手动触发onOpen事件,如:$server->on('handshake',function($request,$response)use($server){echo'handshakesuccessful';defaultHandshake($request,$response);//手动调用onOpen事件$server->defer(function()use($server,$request){onOpen($server,$request);});});//默认握手处理函数defaultHandshake($request,$response){//websocket握手连接算法验证$secWebSocketKey=$request->header['sec-websocket-key'];$patten='#^[+/0-9A-Za-z]{21}[AQgw]==$#';如果(0===preg_match($patten,$secWebSocketKey)||16!==strlen(base64_decode($secWebSocketKey))){$response->end();返回假;}$key=base64_encode(sha1($request->header['sec-websocket-key'].'258EAFA5-E914-47DA-95CA-C5AB0DC85B11',true));$headers=['Upgrade'=>'websocket',Connection''=>'Upgrade','Sec-WebSocket-Accept'=>$key,'Sec-WebSocket-Version'=>'13',];如果(isset($request->header['sec-websocket-proto'])){$headers['Sec-WebSocket-Protocol']=$request->header['sec-websocket-protocol'];}foreach($headersas$key=>$val){onse->$respheader($key,$val);}$response->status(101);$响应->结束();}3:onOpen:当WebSocket客户端与服务器建立连接并完成握手后,会回调该函数,如:$server->on('open',function($server,$request){echo'服务器连接成功';});如果你设置了握手,你可以这样写:$server->on('open',function($server,$request){onOpen($server,$request);});functiononOpen($server,$request){echo'服务器连接成功';}4:onMessage:当服务端收到客户端的数据帧时,会回调这个函数->数据;});5:onRequest:如果设置了onRequest回调,WebSocket也可以同时作为http服务器,在浏览器中直接访问时,会触发onRqeust事件,如果不设置,接收后返回http400http请求错误页面$server->on('request',function($request,$response){echo'serverroutingresponse'});6:onClose:websocket客户端关闭连接后触发//监听WebSocket连接关闭事件$server->on('close',function($server,$fd){echo"ClientProcess".$fd.'关闭';});7:onShutdown:$server->on当websocket服务正常关闭时触发('shutdown',function($server){echo'websocketserverisclosed';});以上就是websocket中常见的事件四:启动websocket服务器$server->start();当我们设置好运行websocket的参数和事件回调后,执行上面的方法,此时我们的websocket服务器就启动了。说明:$fd:客户端连接的ID$data:要发送的数据内容六:websocket中常用的属性和方法一:服务端对象可以获取的属性值和方法(一):获取所有运行参数ofwebsocket$server->setting(2):获取websocket$server->master_pid的主服务进程ID(3):获取所有客户端连接ID[1]$server->getClientList(0,10)//参数1表示骑士的客户端连接ID,参数2表示每页显示的条目数[2]foreach($server->connectionsas$fd){echo$fd;}这里推荐使用$server->connections获取客户端连接(4):判断指定的客户端连接ID是否存在$server->exist($fd)(5)判断指定的客户端连接ID是否为WebSocket已经完成握手的客户端连接$server->isEstablished($fd)(7):我们可以主动关闭指定的客户端连接$server->close($fd);//关闭指定的客户端连接2:属性值request对象和方法(1):获取当前连接的客户端连接ID$request->fd(2):获取客户端请求传递的参数$request->getFor例如,客户端地址为ws://127.0.0.1:8888?id=2,上面得到的方法返回:['id'=>2](3)获取相关服务器信息,我们可以获取请求的路由客户端$request->server['request_uri']如果客户端地址为ws://127.0.0.1:8888/test时,上面获取的方法返回/test(4):获取客户端的请求头信息$request->header我们在客户端实例化websocket的时候加上第二个参数,比如varwsServer='ws://127.0.0.1:8888';varwebsocket=newWebSocket(wsServer,'public');这时候在server端,我们可以通过下面的方法获取public值$request->header['sec-websocket-protocol']以上就是websocket在server端的简单介绍