首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
websocket 服务器同一连接发送百万级别的数据后,websocket服务内存暴涨?是我写的有问题吗?
### 问题描述 websocket 服务器同一连接发送百万级别的数据后,websocket服务内存暴涨?是我写的有问题吗?   ### 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万次左右正常请求。然后后面内存就暴涨了。是我写的有问题吗?还是就是因为大量的请求本身导致的?
发布于4年前 · 15 次浏览 · 来自
提问
scjzhong
### 问题描述 websocket 服务器同一连接发送百万级别的数据后,websocket服务内存暴涨?是我写的有问题吗?   ### 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
回复