用WORKERMAN做了一臺推送/定時任務系統(tǒng),推送功能基本是白天才會有流量,晚上的時候會跑一些大量數(shù)據(jù)的任務(數(shù)據(jù)統(tǒng)計什么的),請問用WM的定時器執(zhí)行這些任務之后可以自動釋放對象資源么?還是需要手動釋放?釋放的內(nèi)存方便給白天的推送服務使用。@walker
workerman內(nèi)存回收機制完全遵循php原有的GC機制。在workerman里業(yè)務代碼都是在函數(shù)或者類方法里運行的,根據(jù)php的回收機制,函數(shù)或者類方法里臨時變量會自動回收。所以開發(fā)時基本不用考慮內(nèi)存回收問題,也不會有內(nèi)存泄漏,不需要手動unset。
?
滿足以下條件的變量需要注意:
1、global關鍵字的全局變量,并且變量是數(shù)組(不是數(shù)組不用關心)
2、static關鍵字的類的靜態(tài)變量,并且變量是數(shù)組(不是數(shù)組不用關心)
3、給worker對象臨時賦值的屬性,比如 worker->uidlist,并且這個屬性是數(shù)組(不是數(shù)組不用關心)
?
以上三種變量是數(shù)組的情況下需要注意,這些變量因為不屬于臨時變量,所以會一直存在于內(nèi)存,注意不要讓數(shù)組里面的數(shù)據(jù)無限增加,否則會導致內(nèi)存泄漏。
?
另外定時器也需要注意,定時器也是用一個類的靜態(tài)數(shù)組存儲,如果無限增加定時器又從不刪除,會導致內(nèi)存泄漏。
$task_worker = new Worker();
$task_worker->name = 'TaskWorker';
$task_worker->count = 2;
$task_worker->onWorkerStart = function($task_worker)
{
$time_interval = 1;
Timer::add($time_interval, function()
{
//計劃任務
$t = new Test();
$t->test();
//停止當前子進程
Worker::stopAll();
});
};
比如這樣的代碼