PHP實現使用者線上狀態檢測

來源:互聯網
上載者:User

   在寫註冊登入的時候,經常有需要檢測使用者狀態.今天就專門研究了一下。還可以吧~不過應該還是有一些小的漏洞,先分享給大家,慢慢改進

  這個是基於ThinkPHP架構的,其他的可以自己根據需求改

 1.先建立一個tags.php檔案,放在配置目錄Conf下。


<?php /* * 添加行為 * */ return array(    'action_begin' => array('OnlineCheck'), ); ?>

   2.定義具體的功能

<?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.在具體的登入方法上添加

// 登入檢測    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意外的處理,但是先分享出來吧,以後改進了再說。呵呵


喜歡討論的朋友可以加群252799167

本文出自 “尛雷” 部落格,請務必保留此出處http://a3147972.blog.51cto.com/2366547/1219081

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.