用的GatewayWorker(3.0.12)
,Linux?Centos服務(wù)器
,PHP?5.6.38
.
啟動服務(wù)器成功后,有300個客戶端正常保持長連接,此時占用總內(nèi)存大約40MB。隨著時間的增長,占用總內(nèi)存逐漸增大,通過status查看時businessWorker占用,運行12小時大約能跑到300M去,為什么會一直增長呢?
在此期間,程序都是正常運行的。
關(guān)于程序的寫法,都是采用new?class,然后調(diào)用class里面的方法。每個class里面無static變量。只有const和public。
整個程序用了md5庫函數(shù)、openssl加密、解密庫函數(shù)、json庫函數(shù)。
為什么我這里的內(nèi)存會逐漸增加呢?現(xiàn)在處理辦法是每天重啟一次。不過好雞肋。求賜教
在運行的過程中,無節(jié)點斷開連接,也無新設(shè)備新建連接。一直是開始的300個左右的客戶端存在。
?
這是在Events里面的協(xié)議解析流程圖
?
花了3天時間,終于搞定了,是漢字轉(zhuǎn)碼的問題
因為用了一個Unicode轉(zhuǎn)漢字的一個方法,這里面用的create_function。這就導(dǎo)致每次調(diào)用就占了8個byte內(nèi)存。
$signString = preg_replace_callback('/\\\\u({4})/i',
create_function(
'$matches',
'return mb_convert_encoding(pack("H*", $matches), "UTF-8", "UCS-2BE");'
),
$signString); 現(xiàn)在把該方法修改為以下就好了
$signString = preg_replace_callback('/\\\\u({4})/i',
function($matches){
return mb_convert_encoding(pack("H*", $matches), "UTF-8", "UCS-2BE");
},
$signString);