首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
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也是不会释放的,现在提供的案例记录文本内容是比较小的。
发布于5年前 · 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
回复