文檔中說,關(guān)閉控制器復(fù)用的前提下,跟傳統(tǒng)php開發(fā)一致,請求結(jié)束后控制器的實例會銷毀、相關(guān)內(nèi)存會釋放。
那么問題來了,在關(guān)閉控制器復(fù)用的前提下,控制器請求的其他類(靜態(tài)調(diào)用:如模型類Table::function或其他靜態(tài)調(diào)用方法,new的其他類如composer的類或第三方extend或service類),這些實例和相關(guān)內(nèi)存是否會被釋放?
workerman不會改變php的gc規(guī)則,寫業(yè)務(wù)一般都是使用臨時變量,臨時變量都會自動回收的,這個與控制器是否復(fù)用沒有關(guān)系。
例如
function index()
{
// 臨時變量$object,index函數(shù)執(zhí)行完會自動釋放
$object = new ClassOne();
return $object->method();
}
有些類內(nèi)部將類實例保存到了靜態(tài)屬性里留著以后復(fù)用,例如數(shù)據(jù)庫類調(diào)用Db::table('xxx')->firt()
時,如果數(shù)據(jù)庫連接對象不存在,則會new一個并保存在類的靜態(tài)數(shù)組里保證它不被釋放,如果存在則復(fù)用這個數(shù)據(jù)庫連接對象。這種故意不釋放并不是問題,反而是一種優(yōu)化,復(fù)用可以大大增加應(yīng)用性能。
所以業(yè)務(wù)開發(fā)時不必特意去考慮變量釋放問題,臨時對象都會釋放。需要復(fù)用的也沒必要釋放。
webman開發(fā)和傳統(tǒng)開發(fā)體驗一樣,沒必要糾結(jié)內(nèi)存問題。另外webman自帶內(nèi)存檢測,發(fā)現(xiàn)某個進(jìn)程占用內(nèi)存即將超過php.ini限定memory_limit值,會自動安全reload這個進(jìn)程,不影響業(yè)務(wù),對客戶來說無感知。