多次并行调用导致内存泄露
flyhope opened this issue · 4 comments
flyhope commented
环境
- 操作系统:CentOS 7.6
- Docker容器操作系统:CentOS8/7
- PHP版本:7.4.1/7.1.33
- Yar版本:2.0.7
问题描述
多次执行Yar_Concurrent_Client::call
,Yar_Concurrent_Client::loop
,会导致内存有增无减,一直使用,最终导致内存超出PHP限制程序崩溃。这通常出现在使用CLI的业务场景中。
示例代码
server.php
<?php
class Server {
function method() {
return date('Y-m-d H:i:s');
}
}
$yar_server = new Yar_Server(new Server());
$yar_server->handle();
client.php
<?php
$uri = 'http://127.0.0.1/server.php';
for ($i = 0; $i < 100; ++$i) {
Yar_Concurrent_Client::call($uri, 'method', array(), function($result) {
});
Yar_Concurrent_Client::call($uri, 'method', array(), function($result) {
});
Yar_Concurrent_Client::loop();
Yar_Concurrent_Client::reset();
$memory = memory_get_usage();
echo "{$i}:\t" . number_format($memory) . "\n";
}
重现方式
server.php可通过HTTP访问到,然后,CLI中执行
php cli.php
执行结果
内存占用越来越大,有增无减,如果循环次数足够多,则最终超过PHP内存限制崩溃
0: 878,896
1: 879,568
2: 880,208
3: 880,848
4: 881,488
5: 882,128
6: 882,768
...
99: 943,520
laruence commented
你拉去master代码编译测试下? 我看之前是因为callback没有被dtor引起一处内存泄漏,不确定还有没有其他的,我这边是暂时看不到了
flyhope commented
你拉去master代码编译测试下? 我看之前是因为callback没有被dtor引起一处内存泄漏,不确定还有没有其他的,我这边是暂时看不到了
试了最新master代码,确实修复了,请问下2.0.8是什么时候发版?
laruence commented
这个问题可以暂时采用不要使用闭包函数作为回掉函数来避免。下一个版本可能还要再等等,凑一波修复改进再发,如果你着急也可以直接使用master分支。
laruence commented
yar-2.1.0发布中已经包含此修复