為了偷懶想用reload平滑重啟,把控制改為實例化來調(diào)用,結果出現(xiàn)內(nèi)存持續(xù)增長,又改回靜態(tài)方法就正常了,想不明白?
public function onMessage(TcpConnection $c, Request $request): void
{
.....
//執(zhí)行控制器
//$res = $controller::$action($c->army); //調(diào)用靜態(tài)方法內(nèi)存使用正常
$res = (new $controller)->$action($c->army);//用new實例化,內(nèi)存持續(xù)增長
$c->close($res);
}
class AppHide
{
//控制器里的方法
public function appHide($army): Response
{
....
return $army->res->withBody(Out::json(0, 'ok'));
}
}
估計是控制器實例沒釋放,在 __destruct(){}
里加個日志看下,是不是觸發(fā)了析構函數(shù)。
據(jù)我所知, new 的類在以下情況下不會釋放
1、類的屬性保存了外部的長周期對象
class A {
public $b;
public function __construct($b)
{
// $b是一個長周期的對象,比如$worker
$this->b = $b;
}
}
2、類實例被保存到了靜態(tài)數(shù)組中
class A {
public static $instance = [];
public function __construct()
{
static::$instance[] = $this;
}
}
$class = 'path\\classname';
if (!isset($instances[$class])) {
$instances[$class] = new $class; // 緩存類實例,避免重復初始化
}