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