问题描述:
public static function onClose($client_id){
$timer_id = Timer::add(5, function($online_uid,$room_id,$redis){
....略...
},array($online_uid,$room_id,$redis),false);
//echo $time_id; //打印出72
$redis->SET("offline_timer:{$online_uid}",$timer_id);
}
public static function onMessage($client_id, $message){
....略...
$timer_id = $redis->GET("offline_timer:{$online_uid}");
// echo $time_id //打印出72
$result = Timer::del($timer_id);
}
我在onClose里面创建了一个定时器,在5秒之后去实现一些功能,但是如果我想在这段等待的时间内想取消这个定时器,发现不能清除,在5秒之后还是执行了定时器里面的操作。我创建定时器之后和在删除定时器之前分别打印time_id,发现是一样的,理论上我想删除的定时器是用一个,这是什么原因?
Worker是多进程的,
进程1设置的定时器,
在进程2是无法删除的。
跨进程删除定时器有解决方案吗?
1、业务想办法把定时器添加和删除放在同一个进程。
2、用channel做进程间通讯
3、利用外部存储(redis等)存储定时器一个状态,删除定时器的时候删除存储的状态。定时器运行时读下状态决定是否删除当前定时器或者是否运行定时器