这个是基于ThinkPHP框架的,其他的可以自己根据需求改
1.先新建一个tags.php文件,放在配置目录Conf下。
1
2
3
4
5
6
7
8
9
|
<?php /* * 添加行为 * */ return array ( 'action_begin' => array ( 'OnlineCheck' ), ); ?> |
2.定义具体的功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
<?php /* * 定义行为: 在线更新 */ class OnlineCheckBehavior extends Behavior { //行为参数 protected $options = array ( 'ONLINE_CHECK' => true, // 默认进行在线 'ONLINE_CHECK_TIME' => 10, // 默认5分钟未活动,说明已下线 ); public function run(& $params ) { if (C( 'ONLINE_CHECK' )) { // 更新session if ((session( '?login_account' )) && (time() - session( 'access_time' ) > 60)) { session( 'access_time' , time()); } // 在线更新 $ip = ip2long (get_client_ip()); $online = M( 'Online' ); // 先删除在线表中 超过5分钟未活动的记录 //$sql = ' delete from __TABLE__ where '; $map [ 'lasttime' ] = array ( 'lt' , time() - C( 'ONLINE_CHECK_TIME' ) * 60); $icount = $online ->where( $map )-> delete (); if (session( '?login_account' )) { // 如果是登录用户 $map = array (); $map [ 'uid' ] = session( 'login_uid' ); $map [ 'lastip' ] = $ip ; $id = $online ->where( $map )->getField( 'id' ); if ( empty ( $id )) { // 不存在在线记录,则清空session session(null); } else { $map = array (); $map [ 'id' ] = array ( 'eq' , $id ); $data [ 'lasttime' ] = time(); $data [ 'lastip' ] = $ip ; $online ->where( $map )->save( $data ); } } else { // 不是登录用户 游客 unset( $map ); $map [ 'lastip' ] = array ( 'eq' , $ip ); $id = $online ->where( $map )->getField( 'id' ); //dump($id); if ( empty ( $id )) { // 不存在在线记录, 则添加 $data = array (); $data [ 'uid' ] = 0; $data [ 'account' ] = 'Guest' ; $data [ 'nickname' ] = '游客' ; $data [ 'lasttime' ] = time(); $data [ 'lastip' ] = $ip ; $online ->add( $data ); } else { $map = array (); $map [ 'id' ] = array ( 'eq' , $id ); $data [ 'lasttime' ] = time(); $data [ 'lastip' ] = $ip ; $online ->where( $map )->save( $data ); } } } } } ?> |
3.在具体的登录方法上添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
// 登录检测 public function checkLogin() { // $this->redirect($url); $username = strtolower ( $this ->_param( 'usr' )); $pwd = $this ->_param( 'pwd' ); $url = $this ->_param( 'url' ); // 目标地址 $is_error = false; if ( empty ( $username ) or empty ( $pwd )) { $this ->assign( 'error_msg' , '用户名和口令不能为空' ); $is_error = true; } if (! $is_error ) { $model = M( 'Usr' ); $map [ 'account' ] = $username ; $map [ 'upwd' ] = strtoupper (md5( $pwd )); $icount = $model ->where( $map )-> count (); if ( $icount == 1) { $list = $model ->where( $map )->find(); // 检测用户是否在线 if ( $this ->isOnline( $list [ 'id' ])) { // <editor-fold defaultstate="collapsed" desc="if开始"> if ( $list [ 'status' ]) { session( 'login_account' , $username ); session( 'login_nickname' , $list [ 'nickname' ]); session( 'last_time' , toDate( $list [ 'last_time' ])); if ( $list [ 'last_ip' ]) { session( 'last_ip' , long2ip( $list [ 'last_ip' ])); } else { session( 'last_ip' , get_client_ip()); } session( 'login_count' , $list [ 'login_count' ]); session( 'login_uid' , $list [ 'id' ]); session( 'login_pwd' , $list [ 'upwd' ]); session( 'access_time' , time()); //用户最后点击页面时间 session超时使用 /// $map [ 'id' ] = $list [ 'id' ]; $data [ 'last_time' ] = time(); $data [ 'last_ip' ] = ip2long (get_client_ip()); $model ->where( $map )->save( $data ); $model ->where( $map )->setInc( 'login_count' , 1); // 检测是否有同一IP的记录,有更新,否则 添加 $online = M( 'Online' ); $map = array (); $map [ 'lastip' ] = ip2long (get_client_ip()); $online_id = $online ->where( $map )->getField( 'id' ); if ( empty ( $online_id )) { // 插入在线用户表 $data = array (); $data [ 'uid' ] = $list [ 'id' ]; $data [ 'account' ] = $list [ 'account' ]; $data [ 'nickname' ] = $list [ 'nickname' ]; $data [ 'lasttime' ] = time(); $data [ 'lastip' ] = ip2long (get_client_ip()); $online ->add( $data ); } else { // 更新在线用户表 $data = array (); $data [ 'uid' ] = $list [ 'id' ]; $data [ 'account' ] = $list [ 'account' ]; $data [ 'nickname' ] = $list [ 'nickname' ]; $data [ 'lasttime' ] = time(); //$data['lastip'] = ip2long(get_client_ip()); $online ->where( $map )->save( $data ); } } else { $is_error = true; $this ->assign( 'error_msg' , '此用户已被禁止登录!' ); } // </editor-fold> if 结束 } else { $is_error = true; $this ->assign( 'error_msg' , '此用户名已在其他电脑登陆,请' . C( 'ONLINE_CHECK_TIME' ) . '分钟后再试!' ); } } else { $is_error = true; $this ->assign( 'error_msg' , '错误的用户名或口令!' ); } } if ( $is_error ) { $this ->display( 'login' ); } else { $this ->redirect( 'Index/index' ); // if (empty($url)) { // $this->redirect('Index/index'); // } else { // $this->redirect($url); // } } } /** * 检测用户是否在线 * @access private * @param int $uid 用户ID * @return Boolean true=不在线 */ private function isOnline( $uid ) { $ip = ip2long (get_client_ip()); $online = M( 'Online' ); $map [ 'uid' ] = array ( 'eq' , $uid ); $list = $online ->where( $map )->find(); if ( empty ( $list )) { // 不存在 return true; } else { // 存在,检测IP是否一致,否则,检测是否超过5分钟 if ( $list [ 'lastip' ] == $ip ) { return true; } else { if ( $list [ 'lasttime' ] < time() - C( 'ONLINE_CHECK_TIME' ) * 60) { return true; } else { return false; } } } } |
以上就是具体的PHP在线状态检测,同一时间只有一个用户可以存在,不过还没有考虑到非正常掉线等,cookie,session意外的处理,但是先分享出来吧
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/ghjbk/p/8037478.html