定时器问题

zwc2004
$io->on('connection', function($socket)use($io){
        echo "new connection coming\n";
        $time_interval = 3;
        $n = 0;
        Timer::add($time_interval, function() {
            global $io,$n;
            $io->emit('sendLatest', $n++);
        });
});
\Workerman\Worker::runAll();

两个问题,麻烦各位帮忙解答一下:
1.当页面打开第一个页面时$n是从0开始返回的,但是打开第二个页面时$n是从第一个页面的数字开始返回,怎么才能每个请求使用一个$n呢?
2.当打开多个页面时,返回的时间间隔明显小于3秒了,打开越多,间隔越小,有时候一下子返回好几个

2381 3 0
3个回答

静默

这样有问题吧,有1万个连接连上来,创建1万个定时器,那服务器不挂才怪啊。
创建一个定时器大家一起用比较合理

静默

$io->on('workerStart', function(){
    // ...
});

  • zwc2004 2018-11-15

    这个是生成了一个定时器,但是如何跟我上面的逻辑结合呢,把信息定时推送给前端?

静默
$io->on('connection', function($socket){
        //all_sockets保存所有的socket
        global $all_sockets;
        //给每个socket添加个属性n记录自增值
        $socket->n = 0;
       $all_sockets = $socket;
});
$io->on('disconnect', function($socket){
       //连接关闭时把socket从all_sockets里删除
        global $all_sockets;
       unset($all_sockets);
});$io->on('workerStart', function() {
    Timer::add(3, function(){
        global $all_sockets;
        foreach ($all_sockets as $socket) {
                $socket->emit('sendLatest', $socket->n++);
        }
    });
});

感觉你的业务逻辑应该是这样的,大概意思是这样,有报错自己解决下

  • zwc2004 2018-11-16

    果然是可以的,追加一个:如果用户关闭了浏览器,我看并没有调用disconnect,也就是说如何释放掉连接呢?

年代过于久远,无法发表回答
🔝