首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
websocket 服务器同一连接发送百万级别的数据后,websocket服务内存暴涨?是我写的有问题吗?
### 问题描述 websocket 服务器同一连接发送百万级别的数据后,websocket服务内存暴涨?是我写的有问题吗? ![](/storage/article-column/3c3whRsEvD7U11wfQEqGqFCFkGOnKITafzkR0WVR.bmp) ![](/storage/article-column/xQokaM6FJUyNim6j4i4K467zrVqCDabDbjD3RLIM.bmp) ### Swoole版本,PHP版本,以及操作系统版本信息 PHP 7.4.21 swoole 4.8.5 centos 7 ### 相关代码 #### setting 配置 ```php [ 'worker_num' => 20, 'max_request' => 0, 'log_file' => '/var/log/swoole/chatroom.log', 'enable_coroutine' => true ] ``` #### onmessage 方法 ```php function onMessage(\swoole_websocket_server $server, \Swoole\WebSocket\Frame $frame) { $req = json_decode($frame->data); if(empty($req) || empty($req->route)){ return ; } $routeArr = explode("/", trim($req->route, "/")); $className = $routeArr[0]; $actionName = $routeArr[1]; if(class_exists($className) && method_exists($className, $actionName)){ try { echo date("Y-m-d H:i:s") . "\n"; echo "memory start:" . memory_get_usage() . "\n"; call_user_func_array([$className, $actionName], [$server, $frame]); echo "memory end:" . memory_get_usage() . "\n\n"; } catch (\Exception $e) { echo $e->getFile() . " " . $e->getLine() . " " . $e->getMessage() . "\n"; } }else{ $server->push($frame->fd, "route error"); } } ``` #### 逻辑处理代码部分 ```php <?php class Room { /** * 加入房间 * @param \swoole_websocket_server $server * @param \Swoole\WebSocket\Frame $frame */ function join(\swoole_websocket_server $server, \Swoole\WebSocket\Frame $frame) { $data = ["status" => 1, "data" => new stdClass(), "msg" => "ok"]; //echo "Room-join\n"; $server->push($frame->fd, json_encode($data)); } } ``` #### 客户端代码: ```php $client = new \WebSocket\Client("ws://192.168.198.128:9502"); for($i = 0; $i < 1000000; $i++){ $client->text('{"route":"Room/join","param":{"uid": 5775,"room_id": 3}}'); echo $i . "\n"; } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 循环100万次,大概前80万次左右正常请求。然后后面内存就暴涨了。是我写的有问题吗?还是就是因为大量的请求本身导致的?
发布于2年前 · 15 次浏览 · 来自
提问
scjzhong
### 问题描述 websocket 服务器同一连接发送百万级别的数据后,websocket服务内存暴涨?是我写的有问题吗? ![](/storage/article-column/3c3whRsEvD7U11wfQEqGqFCFkGOnKITafzkR0WVR.bmp) ![](/storage/article-column/xQokaM6FJUyNim6j4i4K467zrVqCDabDbjD3RLIM.bmp) ### Swoole版本,PHP版本,以及操作系统版本信息 PHP 7.4.21 swoole 4.8.5 centos 7 ### 相关代码 #### setting 配置 ```php [ 'worker_num' => 20, 'max_request' => 0, 'log_file' => '/var/log/swoole/chatroom.log', 'enable_coroutine' => true ] ``` #### onmessage 方法 ```php function onMessage(\swoole_websocket_server $server, \Swoole\WebSocket\Frame $frame) { $req = json_decode($frame->data); if(empty($req) || empty($req->route)){ return ; } $routeArr = explode("/", trim($req->route, "/")); $className = $routeArr[0]; $actionName = $routeArr[1]; if(class_exists($className) && method_exists($className, $actionName)){ try { echo date("Y-m-d H:i:s") . "\n"; echo "memory start:" . memory_get_usage() . "\n"; call_user_func_array([$className, $actionName], [$server, $frame]); echo "memory end:" . memory_get_usage() . "\n\n"; } catch (\Exception $e) { echo $e->getFile() . " " . $e->getLine() . " " . $e->getMessage() . "\n"; } }else{ $server->push($frame->fd, "route error"); } } ``` #### 逻辑处理代码部分 ```php <?php class Room { /** * 加入房间 * @param \swoole_websocket_server $server * @param \Swoole\WebSocket\Frame $frame */ function join(\swoole_websocket_server $server, \Swoole\WebSocket\Frame $frame) { $data = ["status" => 1, "data" => new stdClass(), "msg" => "ok"]; //echo "Room-join\n"; $server->push($frame->fd, json_encode($data)); } } ``` #### 客户端代码: ```php $client = new \WebSocket\Client("ws://192.168.198.128:9502"); for($i = 0; $i < 1000000; $i++){ $client->text('{"route":"Room/join","param":{"uid": 5775,"room_id": 3}}'); echo $i . "\n"; } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 循环100万次,大概前80万次左右正常请求。然后后面内存就暴涨了。是我写的有问题吗?还是就是因为大量的请求本身导致的?
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2022-04-20
Rango
这可能是系统运行需要更大的内存空间,而不是内存泄露。可以将`memory_limit`调整为`512M`或`1G`。定期观察进程内存是否持续上涨
赞
1
回复
微信公众号
热门内容
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。