使用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{
//其它處理
}
}
代碼如上
問題:當(dāng)刪除定時器后,又重新創(chuàng)建新的定時器時,反復(fù)幾次后,就會發(fā)現(xiàn)有些定時器沒有刪除停止掉,并且又新多了一些定時器出來。
這是為什么呢?啥原因呢?
GatewayWorker手冊說了,
定時器中不要直接使用$_SESSION
變量,因為定時器運行那一刻無法確定$_SESSION
變量里存儲的值屬于哪個client_id
。如果定時器里面需要獲得session,可以使用Gateway::getSession($client_id)獲取。
定時器自己刪除自己用
// 注意,回調(diào)里面使用當(dāng)前定時器id必須使用引用(&)的方式引入
$timer_id = Timer::add(1, function()use(&$timer_id)
{
static $i = 0;
echo $i++."\n";
// 運行10次后刪除定時器
if($i === 10)
{
Timer::del($timer_id);
}
});