laruence/yar

多次并行调用导致内存泄露

flyhope opened this issue · 4 comments

环境

  • 操作系统:CentOS 7.6
  • Docker容器操作系统:CentOS8/7
  • PHP版本:7.4.1/7.1.33
  • Yar版本:2.0.7

问题描述

多次执行Yar_Concurrent_Client::callYar_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

你拉去master代码编译测试下? 我看之前是因为callback没有被dtor引起一处内存泄漏,不确定还有没有其他的,我这边是暂时看不到了

你拉去master代码编译测试下? 我看之前是因为callback没有被dtor引起一处内存泄漏,不确定还有没有其他的,我这边是暂时看不到了

试了最新master代码,确实修复了,请问下2.0.8是什么时候发版?

这个问题可以暂时采用不要使用闭包函数作为回掉函数来避免。下一个版本可能还要再等等,凑一波修复改进再发,如果你着急也可以直接使用master分支。

yar-2.1.0发布中已经包含此修复