当前位置: 首页 > Linux

swoole客户端解析详解(作为TCP链接、webscoket链接等客户端)

时间:2023-04-06 19:22:41 Linux

swoole客户端文章目录1、swoole客户端可以解决什么样的问题?2.如何使用?三、注意事项1、首先,swoole客户端可以帮助我们解决什么样的问题?业务场景当业务需要链接TCP、UDP、socket、websocket服务时,我们需要写一个客户端来链接相应的服务(比如链接一些数据源)。这时候选择就很多了,workerman的AsyncTcpConnection,或者使用php自带的socket函数(socket_create,socket_read等函数),swoole客户端(Swoole\Client)等都可以。每个都有自己的优点和缺点,只需选择适合您和您的业务的那个。这次我们选择Swoole\Client。2.如何使用?废话不多说,直接上传我打包的代码,有不懂的看评论理解,可以保存方便,以后直接用。classSwooleClient{//链接对象private$client;/***SwooleClient构造函数。*/publicfunction__construct(){$this->client=newSwoole\Client(SWOOLE_SOCK_TCP);$this->client->set(array('open_eof_check'=>true,//开启EOF检测'package_eof'=>"\r\n",//设置EOF,包间分隔符'package_max_length'=>1024*1024*2,//设置一个数据包的最大数据包大小,以字节为单位。默认2m));}/***Notes:链接对应的ip*User:Wenling*DateTime:2021/11/1710:46pm*@paramstring$ip链接的ip,本地或外网ip*@paramint$port端口号*@throws\Exception*/publicfunctionconnect($ip='127.0.0.1',$port=9501){if(!$this->client->connect($ip,$port,-1)){thrownew\Exception(sprintf('Swoole错误:%s',$this->client->errCode));}}/***Notes:Senddata*User:Swoole*DateTime:2021/11/1710:44PM*@param$data数据发送*@returnmixed*@throws\Exception*/publicfunctionsend($data){如果($this->client->isConnected()){如果(!is_string($data)){$data=json_encode($data);}返回$this->client->send($data);}else{thrownew\Exception('SwooleServerdoesnotconnected.');}}/***注意:关闭链接*用户:闻钟声*DateT时间:2021/11/1710:45pm*/publicfunctionclose(){$this->client->close();}/***Notes:Receivedata*User:Smellthebell*DateTime:2021/11/1710:45pm*@returnarray*/publicfunctionrecv(){//接受数据返回$this->client->接收();}}如果想作为webscoket客户端使用,也是可以的,推荐使用swoole官方作者打包的websocket包(saber)(github链接:https://github.com/swlib/saber)//link对应的websocket链接$websocket=SaberGM::websocket('ws://127.0.0.1:9999');while(true){//接收链接推送的数据,1为接收数据超时时间echo$websocket->recv(1)."\n";//处理你的业务逻辑//给ws服务推送数据$websocket->push("hello");//coroutinesleepfor1secondco::sleep(1);}分享一个在swoole.log日志中使用saber过程中遇到的实际问题(在swooleset中可以配置swoole运行过程中的日志信息\server的方法)。不熟悉的可以参考下图中红色标出的地方配置日志路径。配置好日志后,会发现如下图出现deadlock!!!,Coroutinedeadlock。原因是我实际项目在where(true)有io操作(redis读写),会产生协程切换,因为是where(true)的死循环,而我一直在切换协程,而协程是死锁错误。研究了很久,发现这个错误不影响功能。其实你可以配置下图中的选项来屏蔽它。3、注意事项在使用tcp或者websocket客户端时,一般都会伴随心跳检测。此时调用相应tcp链接的send方法或者saber中的psuh方法,向服务器发送相应的心跳信息。本文为叶宇文玲原创文章,转载无需联系本人,但请注明文章出处。文章来源:叶宇文玲的贴心文章(https://segmentfault.com/a/11...)