用的GatewayWorker(3.0.12)
,Linux?Centos服務(wù)器
,PHP?5.6.38
.
啟動(dòng)服務(wù)器成功后,有300個(gè)客戶端正常保持長連接,此時(shí)占用總內(nèi)存大約40MB。隨著時(shí)間的增長,占用總內(nèi)存逐漸增大,通過status查看時(shí)businessWorker占用,運(yùn)行12小時(shí)大約能跑到300M去,為什么會(huì)一直增長呢?
在此期間,程序都是正常運(yùn)行的。
關(guān)于程序的寫法,都是采用new?class,然后調(diào)用class里面的方法。每個(gè)class里面無static變量。只有const和public。
整個(gè)程序用了md5庫函數(shù)、openssl加密、解密庫函數(shù)、json庫函數(shù)。
為什么我這里的內(nèi)存會(huì)逐漸增加呢?現(xiàn)在處理辦法是每天重啟一次。不過好雞肋。求賜教
在運(yùn)行的過程中,無節(jié)點(diǎn)斷開連接,也無新設(shè)備新建連接。一直是開始的300個(gè)左右的客戶端存在。
?
這是在Events里面的協(xié)議解析流程圖
?
花了3天時(shí)間,終于搞定了,是漢字轉(zhuǎn)碼的問題
因?yàn)橛昧艘粋€(gè)Unicode轉(zhuǎn)漢字的一個(gè)方法,這里面用的create_function。這就導(dǎo)致每次調(diào)用就占了8個(gè)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);