国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

onMessage回調(diào)中實例化類和靜態(tài)方法內(nèi)存消耗差別怎么這么大?這是為何?

army

為了偷懶想用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'));
    }
}

941 3 1
3個回答

nitron

試試在$c->close($res)后加上unset($res) ?

  • 暫無評論
xiuwang

估計是控制器實例沒釋放,在 __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;
    }
}
  • army 2023-05-20

    是的,應該是沒有釋放

Gin
$class = 'path\\classname';
if (!isset($instances[$class])) {
$instances[$class] = new $class; // 緩存類實例,避免重復初始化
}
年代過于久遠,無法發(fā)表回答
??