多个定时器 不同的客户端长时间停留 数据混乱

雪昙花

定义了两个定时器,根据来源的不同,发送不同的数据,现在如果单独访问没有问题,我在两个浏览器,同时访问两个数据,一个不动,另一个刷新几次,这两个端接收都是同一个数据了,

我想实现的是客户端只有第一次访问的时候,会发送数据过来,发送后,就一直是服务端定时推送数据给这个客户端
[attach]2232[/attach]
 

2624 4 0
4个回答

six

你的逻辑有bug吧,$this->cmd和$this->params是所有定时器共享的,在onMessage里更改了$this->cmd和$this->params,所有定时器都影响了

  • 雪昙花 2019-07-04

    onMessage无法设置定时,这样的话,怎么针对每个客户端,获得者两个数据啊?

six

针对连接的对象是$connection啊,$connection->cmd = 'xxxx'; $connection->params = 'xxxx'; 。
 
还有,在onClose的时候要把对应连接的定时器也删除,不然你的定时器数量是无限增长,假设有1万个定时器每秒跑一次,你的业务基本就挂了。

  • 雪昙花 2019-07-04

    那定时器放到onworkerstart里的话,是不是可以就一个的?但是这样的话,针对用户跑的话,是不是又不对了

six

 一个定时器也可以啊。你可以设置一个定时器,然后
foreach($worker->connections as $connection){
    switch ($connection->cmd) {
        $connection->sned(...);
    }
}
遍历所有连接 判断$connection->cmd = 'xxxx'; $connection->params = 'xxxx'; 并生成数据发送

  • 雪昙花 2019-07-04

    之前是这样做的,但是也是数据错乱的,比如我不同浏览器开启访问不同的接口,如果刷新的话,返回成一样的数据了

  • six 2019-07-04

    那应该是你业务逻辑的bug,针对每个连接设置cmd params不会乱。所有连接你都用$this->cmd来生成数据所有连接当然都一样了。这很容易理解吧

  • 雪昙花 2019-07-04

    @1393:理解了,但是就是不知道如何解决这个,如何针对每个链接的cmd推送啊!因为一个页面打开,对方不刷新,这样的话,就需要服务端针对这个链接一直推送数据了

  • six 2019-07-04

    上面示例代码都给了...,你还不会

  • 雪昙花 2019-07-04

    @1393:最早就是这样的,有问题,所以想问个思路,看看有什么好的办法

雪昙花

[attach]2233[/attach]
之前就是这样做的,就是这样会有问题的

  • six 2019-07-04

    大哥,上面说过2遍了,$this->cmd是所有连接都共享的,用$connection->cmd来存储每个连接的cmd

  • 雪昙花 2019-07-04

    @1393:强,谢谢

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