预期的效果:通过 gateway 向已建立连接的客户端设备发送指令,但由于客户端接收不同指令的时间有1s的限制,所以需要进行延时。
实现方式:目前能够想到的实现方式有两种,一是人为延时,即采用 sleep(1) 指令,代码如下:
Timer::add($timer, function()use($instrs, $timer) {
foreach ($instrs as $instr) {
$uid = $instr;
$ins = $instr;
Gateway::sendToUid($uid, hex2bin($ins));
sleep(1);
}
});
但这种实现方式容易出现服务端 worker busy 的现象,于是想到了另一种实现方式,即计时器嵌套,代码如下:
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++;
// 删除定时器
if($i >= $count){
Timer::del($timer_id);
}
});
});
疑问:现在这种方式频繁添加删除定时器,而且出现定时器嵌套,是否会出现什么不良影响,如服务器负担加重或其他的什么问题?
用过定时器嵌套没有啥不良影响,放心用吧。