使用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{
//其它处理
}
}
代码如上
问题:当删除定时器后,又重新创建新的定时器时,反复几次后,就会发现有些定时器没有删除停止掉,并且又新多了一些定时器出来。
这是为什么呢?啥原因呢?
要不要重启的!~
GatewayWorker手册说了,
定时器中不要直接使用
$_SESSION
变量,因为定时器运行那一刻无法确定$_SESSION
变量里存储的值属于哪个client_id
。如果定时器里面需要获得session,可以使用Gateway::getSession($client_id)获取。定时器自己删除自己用
嗯。谢了,根据这个来处理,已搞定了
忘记了AOpen和CheckToken函数其实是已经在定时器内了,因为它们是个死循环的。