預(yù)期的效果:通過(guò) gateway 向已建立連接的客戶端設(shè)備發(fā)送指令,但由于客戶端接收不同指令的時(shí)間有1s的限制,所以需要進(jìn)行延時(shí)。
?實(shí)現(xiàn)方式:目前能夠想到的實(shí)現(xiàn)方式有兩種,一是人為延時(shí),即采用 sleep(1) 指令,代碼如下:
Timer::add($timer, function()use($instrs, $timer) {
foreach ($instrs as $instr) {
$uid = $instr;
$ins = $instr;
Gateway::sendToUid($uid, hex2bin($ins));
sleep(1);
}?? ??? ??? ?
});?? ?
但這種實(shí)現(xiàn)方式容易出現(xiàn)服務(wù)端 worker busy 的現(xiàn)象,于是想到了另一種實(shí)現(xiàn)方式,即計(jì)時(shí)器嵌套,代碼如下:
?? ??? ??? ?Timer::add($timer, function()use($instrs) {
?? ??? ??? ??? ?$i = 0;
?? ??? ??? ??? ?$count = count($instrs);
?? ??? ??? ??? ?$timer_id = Timer::add(1, function()use($instrs, &$timer_id, &$i, &$count)
?? ??? ??? ??? ?{?? ??? ? ?? ??? ??? ?
?? ??? ??? ??? ??? ?$uid = $instrs;
?? ??? ??? ??? ??? ?$ins = $instrs;
?? ??? ??? ??? ??? ?Gateway::sendToUid($uid, hex2bin($ins));?? ?
?? ??? ??? ??? ??? ?$i++;
?? ??? ??? ??? ??? ?// 刪除定時(shí)器
?? ??? ??? ??? ??? ?if($i >= $count){
?? ??? ??? ??? ??? ??? ?Timer::del($timer_id);
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?});?? ??? ??? ?
?? ??? ??? ?});
疑問(wèn):現(xiàn)在這種方式頻繁添加刪除定時(shí)器,而且出現(xiàn)定時(shí)器嵌套,是否會(huì)出現(xiàn)什么不良影響,如服務(wù)器負(fù)擔(dān)加重或其他的什么問(wèn)題?