Home
Download
Document
Forum
Video
Donate
Source Code
AI 助理
Sponsors
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
Products
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
Login
Register
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
mysql大查询后内存不释放
### 问题描述 查询后内存不释放 运行前内存情况: nobody 60849 0.0 0.0 606224 15944 ? S 17:47 0:00 server9501 nobody 60850 0.0 0.0 606160 16800 ? S 17:47 0:00 server9501 nobody 60851 0.5 0.1 655440 66096 ? S 17:47 0:00 server9501 nobody 60853 0.0 0.0 606224 15944 ? S 17:47 0:00 server9501 nobody 60854 0.0 0.0 606224 15944 ? S 17:47 0:00 server9501 运行后内存情况: nobody 60849 0.3 0.1 657616 66116 ? S 17:47 0:00 server9501 nobody 60850 0.2 0.1 657616 66144 ? S 17:47 0:00 server9501 nobody 60851 0.3 0.1 657616 66116 ? S 17:47 0:00 server9501 nobody 60853 0.3 0.1 657616 66120 ? S 17:47 0:00 server9501 nobody 60854 0.4 0.1 657616 66116 ? S 17:47 0:00 server9501 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.5.6 PHP Version 7.3.24 CentOS Linux release 7.1.1503 (Core) ### 相关代码 ```php class Mysqlpools3_class { public function query($host, $user, $passwd, $db, $port){ try{ $mysql_class = new mysqli($host, $user, $passwd, $db, $port); $mysql_class->query('SET NAMES "utf8"');//指定字符集 $data = $mysql_class->query('select content,msg_id from a1_msg_test2 where ymd = '.date('ymd').' limit 10000');//查询 $results = array(); while($row = $data->fetch_assoc()) { $results[] = $row; } // mysql释放结果集,防止mysql数据库内存泄漏 try{ $data->free(); } catch(Throwable $e){ } try{ $data->free_result(); } catch(Throwable $e){ } try{ $data->close(); } catch(Throwable $e){ } //return $results; } catch(Throwable $e){ } } } 执行代码: protected function test5(){ echo memory_get_usage()."<br />\n"; $Mysqlpools3_class = new Mysqlpools3_class; $info = $Mysqlpools3_class->query('192.168.1.243','datauser','20162014datauserpassword2014', 'source_1', 3306); print_r($info); echo memory_get_usage()."<br />\n"; $this->system_die('ok'); } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 内存能释放出来占用降低,如果这个1万条记录运行内存涨到300M也是不会释放的,现在提供的案例记录文本内容是比较小的。
发布于4年前 · 11 次浏览 · 来自
提问
卡大大
### 问题描述 查询后内存不释放 运行前内存情况: nobody 60849 0.0 0.0 606224 15944 ? S 17:47 0:00 server9501 nobody 60850 0.0 0.0 606160 16800 ? S 17:47 0:00 server9501 nobody 60851 0.5 0.1 655440 66096 ? S 17:47 0:00 server9501 nobody 60853 0.0 0.0 606224 15944 ? S 17:47 0:00 server9501 nobody 60854 0.0 0.0 606224 15944 ? S 17:47 0:00 server9501 运行后内存情况: nobody 60849 0.3 0.1 657616 66116 ? S 17:47 0:00 server9501 nobody 60850 0.2 0.1 657616 66144 ? S 17:47 0:00 server9501 nobody 60851 0.3 0.1 657616 66116 ? S 17:47 0:00 server9501 nobody 60853 0.3 0.1 657616 66120 ? S 17:47 0:00 server9501 nobody 60854 0.4 0.1 657616 66116 ? S 17:47 0:00 server9501 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.5.6 PHP Version 7.3.24 CentOS Linux release 7.1.1503 (Core) ### 相关代码 ```php class Mysqlpools3_class { public function query($host, $user, $passwd, $db, $port){ try{ $mysql_class = new mysqli($host, $user, $passwd, $db, $port); $mysql_class->query('SET NAMES "utf8"');//指定字符集 $data = $mysql_class->query('select content,msg_id from a1_msg_test2 where ymd = '.date('ymd').' limit 10000');//查询 $results = array(); while($row = $data->fetch_assoc()) { $results[] = $row; } // mysql释放结果集,防止mysql数据库内存泄漏 try{ $data->free(); } catch(Throwable $e){ } try{ $data->free_result(); } catch(Throwable $e){ } try{ $data->close(); } catch(Throwable $e){ } //return $results; } catch(Throwable $e){ } } } 执行代码: protected function test5(){ echo memory_get_usage()."<br />\n"; $Mysqlpools3_class = new Mysqlpools3_class; $info = $Mysqlpools3_class->query('192.168.1.243','datauser','20162014datauserpassword2014', 'source_1', 3306); print_r($info); echo memory_get_usage()."<br />\n"; $this->system_die('ok'); } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 内存能释放出来占用降低,如果这个1万条记录运行内存涨到300M也是不会释放的,现在提供的案例记录文本内容是比较小的。
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2020-11-23
QAQ
你return的info不占用内存?
赞
0
回复
2020-11-23
QAQ
如果你觉得不是这里的问题 请在第二次取内存占用前先unset($info) 然后再丢锅给swoole
赞
0
回复
2020-11-24
卡大大
结贴了,官方文档说是mysqlnd结果集不归PHP管理,所以它占用内存部分在操作系统进程里会开起来高。
赞
0
回复
微信公众号
热门内容
作者其它话题
- Swoole-v4.6.5 bug
- SwooleCoroutineHttppost如何请求https
- PDOPool/MysqliPool/RedisPool原始连接池功能
- 我看新版本里已经支持curl hook了,它和协程 HTTP/WebSocket 客户端我们在选择使用时候官方有什么建议?选择哪个性能好呢?
- 投递定时任务的work进程如果一直忙处理其它业务,定时器能正常的工作吗?
暂无回复的问答
- 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一直是同一个。没用使用到多进程啊。