為了偷懶想用reload平滑重啟,把控制改為實(shí)例化來(lái)調(diào)用,結(jié)果出現(xiàn)內(nèi)存持續(xù)增長(zhǎng),又改回靜態(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實(shí)例化,內(nèi)存持續(xù)增長(zhǎng)
$c->close($res);
}
class AppHide
{
//控制器里的方法
public function appHide($army): Response
{
....
return $army->res->withBody(Out::json(0, 'ok'));
}
}
估計(jì)是控制器實(shí)例沒(méi)釋放,在 __destruct(){}
里加個(gè)日志看下,是不是觸發(fā)了析構(gòu)函數(shù)。
據(jù)我所知, new 的類在以下情況下不會(huì)釋放
1、類的屬性保存了外部的長(zhǎng)周期對(duì)象
class A {
public $b;
public function __construct($b)
{
// $b是一個(gè)長(zhǎng)周期的對(duì)象,比如$worker
$this->b = $b;
}
}
2、類實(shí)例被保存到了靜態(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; // 緩存類實(shí)例,避免重復(fù)初始化
}