Timer问题

小吴大大

在测试onMessage里面写Timer发现无法清除,这让我很郁闷。
代码1:

use \GatewayWorker\Lib\Gateway;
use \GatewayWorker\Lib\Store;
use \GatewayWorker\Lib\Db;
use \Workerman\Lib\Timer;
class Event{
    public static function onMessage($client_id, $message)
    {
       switch($message_data)
        {
          case ‘re_login’:
                  $_SESSION = $time_interval=10;
              Timer::add($time_interval, function(){
                      var_dump('timer1-work');

          });

         }
    }
     public static function onClose($client_id)
     {
        Timer::del($_SESSION );
     }

}

代码二:

class Event{
    public static function onMessage($client_id, $message)
    {
       switch($message_data)
        {
          case ‘re_login’:
                  $_SESSION = $time_interval=10;
              Timer::add($time_interval, function(){
                      var_dump('timer2-work');

          });

         }
    }
     public static function onClose($client_id)
     {
        Timer::delAll();
     }

}

}}}

以上两种貌似都是判断客户端进入和退出时的操作,刚开始测试可以。但客户端进出频繁时,定时器会并发。清除不了。大神来帮本菜鸟分析一下呗。

3649 3 0
3个回答

walkor

$_SESSION = $time_interval=10;

你这句把$_SESSION写死了固定是10了,Timer::del($_SESSION ); 当然无效

这个你要自己面壁去了,就几行代码自己都看不出这么明显的罗辑问题

另外:
businessWorker是多进程的,删除定时器和设定定时器的进程必须是同一个。
参考手册路由部分,使用示例二,将同一个client_id的请求绑定到同一个businessWorker上处理就ok了

http://www.workerman.net/gatewaydoc/gateway-worker-development/router.html

  • 暂无评论
小吴大大

抱歉,我已经面壁了2小时。改了代码,但是还是无效。退出的时候还是无法清除是为什么呢

  • 暂无评论
walkor

businessWorker是多进程的,删除定时器和设定定时器的进程必须是同一个。
参考手册路由部分,使用示例二,将同一个client_id的请求绑定到同一个businessWorker上处理就ok了

http://www.workerman.net/gatewaydoc/gateway-worker-development/router.html

  • 暂无评论
年代过于久远,无法发表回答
🔝