客户下线,我查了很多资料,没有什么好解决的办法。
1,正常流程点击退出登陆。可以获取到下线时间。
2,关闭网页可以用js来获取关闭网页事件获取下线时间。
3,不正常套路,断线,pc端故障,断电,关闭浏览器。这个你怎么区分。
这个大家要是有更好的办法,请留下宝贵的意见。
我是用心跳来实现的,workman机制 有个心跳功能
通过心跳每过多少秒发送一次ajax 请求 通过当前id 去存到redis 。
假设20秒存一次我先获取上次的存的时间戳跟现在的时间戳相比如果大于2分钟就为下线。从而存到redis
/**
* 心跳检测
* heartbeat
*/
public function heartbeatOp() {
$rulerid = $this->userinfo['rulerid'];
$key = $rulerid.'time';
$time = time();
$datetime = redis()->lrange($key, 0 ,0);
//判断最后一次的时间是否大于120秒
if(bcsub($time,$datetime['0']) > 120) {
$result = model('kefuLogin')->where(['server_uid' => $rulerid])->order('id desc')->find();
$data = ['id' =>$result['id'], 'server_uid' => $rulerid, 'downtime' => $time+20];
model('kefuLogin')->allowField(true)->isUpdate(true)->save($data);
} else {
$result =redis()->LPUSH($key,$time);
}
return $result;
}
但是这样还是获取不到最终时间,假设这个网站只有你自己。登陆的只有你自己,你一下线就这个方法不执行了好像所以还是直接存数据库比较好