swoft-cloud / swoft

🚀 PHP Microservice Full Coroutine Framework
https://swoft.org
Apache License 2.0
5.58k stars 786 forks source link

通过bean方法获取声明@Bean(scope=Scope::PROTOTYPE)类型的对象的时候,内存占用一直增加 #514

Closed crack007 closed 5 years ago

crack007 commented 5 years ago

初步判定bug出现在vendor/swoft/framework/src/Proxy/Proxy.php 文件的newProxyInstance方法

  // Proxy property
        $id = \uniqid('', false);
        $proxyClassName = \basename(str_replace("\\", '/', $className));
        $proxyClassName = $proxyClassName . '_' . $id;
        $handlerPropertyName = '__handler_' . $id;
        // Base class template
        $template = "class $proxyClassName extends $className {
       .....";
        eval($template);

在生成单例时,只会访问此方法一次,所以没有问题,但是在工厂模式下,会每次都调用此方法,虽然className是一样的,但是每一次都会通过uniqid生成随机后缀,每次都会声明一个类,结果造成内存占用不断增加

wujunze commented 5 years ago

https://github.com/swoft-cloud/swoft-component/pull/313/files

huangzhhui commented 5 years ago

@crack007 请将 swoft/framework 组件升级到 1.0.29,然后再看看这个问题

crack007 commented 5 years ago

已解决,不过只能通过bean()方法获取不同的对象,无法通过对象属性inject去获取,用@inject方式获取到的是同一个对象,个人觉得没必要用@inject去获取