首页
文档
问答
捐赠
源代码
商业产品
Swoole Tracker
Swoole Plus
Swoole Compiler
Swoole 微课程
商业合作
登录
注册
EN
全部
提问
分享
讨论
建议
公告
开发框架
发表新帖
swoole websocket协程服务端 出现过多CLOSE_WAIT
偎徕
去年
### 问题描述  协程不是自己会回收吗, 我这个 CLOSE_WAIT 有点多 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole4.4 php7,4 ### 相关代码 ```php 请将代码粘贴至此处(请勿用截图) \Co\run(function () { $server = new \Co\Http\Server("0.0.0.0", '9501'); //监听全网段地址、端口 $server->handle('/websocket', function ($request, $ws) { $ws->upgrade();//向客户端发送websocket握手信息 global $wsObjects; $objectId = spl_object_id($ws); $wsObjects[$objectId] = $ws; $cid = \Co::getCid(); echo "Client: {$cid}connect\n"; while (true) { $frame = $ws->recv(); if ($frame === '' || $frame->data == 'close' ) { unset($wsObjects[$objectId]); $ws->close(); break; } else if ($frame === false) { unset($wsObjects[$objectId]); $ws->close(); echo "error : " . swoole_last_error() . "\n"; break; } else { if ($frame->data == 'close' || get_class($frame) === \Swoole\WebSocket\CloseFrame::class) { unset($wsObjects[$objectId]); $ws->close(); return; } echo "receive from {$cid}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $args = json_decode($frame->data,true); switch($args['method']){ case 'mediaPush': break; case 'appInitPush': break; default: unset($wsObjects[$objectId]); $ws->close(); break; } } } }); $server->start(); }); ### 你期待的结果是什么?实际看到的错误信息又是什么?
评论
2020-12-28
鲁飞
提问代码记得格式化,放在两个```之间。 这个问题建议你看看tcp协议
点赞
1
回复
2020-12-28
偎徕
回复
鲁飞
好的,我看了. 请问可以通过定时器 定时清理这些占用吗
点赞
0
回复
2021-01-11
序冢
回复
偎徕
Close Wait 是一种连接泄露的表现,就是说客户端已经关闭连接,或者超时了,但是服务端阻塞住了,没来的及关闭连接,或者是程序发现客户端被断开了,根本没关闭连接,具体请查看tcp的4次挥手
点赞
0
回复