定时器删除了还是会存在

freely

使用GatewayWorker,开启了10个进程

function OnMessage($client_id,$data){
    switch($data['cmd']){
        case 'open':{
            self::AOpen($client_id,$data);
            break;
        }
    }
}

function AOpen($client_id,$data){
    $token=$data['token'];
    $timerId=isset($_SESSION['timer_id'])?$_SESSION['timer_id']:'';
    if($timerId!=''){
        Timer::del($timerId);
    }
    timerId=Timer::add(5,function($client_id,$token){
        Common::CheckToken($client_id,$token);
    });
    $_SESSION['timer_id']=$timerId;
}

function CheckToken($client_id,$token){
    if($token=='5'){
        $NowtimerId=isset($_SESSION['timer_id'])?$_SESSION['timer_id']:'';
        Timer::del($NowtimerId);
        $token=self::getNewToken();//重新生成新的token
        $data=[
            'token'=>$token
        ];
        AOpen($client_id,$data);
    }else{
        //其它处理
    }
}

代码如上
问题:当删除定时器后,又重新创建新的定时器时,反复几次后,就会发现有些定时器没有删除停止掉,并且又新多了一些定时器出来。
这是为什么呢?啥原因呢?

112 2 0
2个回答

liziyu

要不要重启的!~

  • 暂无评论
latin

GatewayWorker手册说了,
定时器中不要直接使用$_SESSION变量,因为定时器运行那一刻无法确定$_SESSION变量里存储的值属于哪个client_id。如果定时器里面需要获得session,可以使用Gateway::getSession($client_id)获取。

定时器自己删除自己用

    // 注意,回调里面使用当前定时器id必须使用引用(&)的方式引入
    $timer_id = Timer::add(1, function()use(&$timer_id)
    {
        static $i = 0;
        echo $i++."\n";
        // 运行10次后删除定时器
        if($i === 10)
        {
            Timer::del($timer_id);
        }
    });
  • freely 7天前

    嗯。谢了,根据这个来处理,已搞定了

  • freely 7天前

    忘记了AOpen和CheckToken函数其实是已经在定时器内了,因为它们是个死循环的。

🔝