當(dāng)前位置:首頁(yè) >  站長(zhǎng) >  編程技術(shù) >  正文

基于PHP實(shí)現(xiàn)用戶在線狀態(tài)檢測(cè)

 2020-11-23 13:30  來(lái)源: 腳本之家   我來(lái)投稿 撤稿糾錯(cuò)

  阿里云優(yōu)惠券 先領(lǐng)券再下單

這篇文章主要介紹了基于PHP實(shí)現(xiàn)用戶在線狀態(tài)檢測(cè),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這個(gè)是基于ThinkPHP框架的,其他的可以自己根據(jù)需求改

1.先新建一個(gè)tags.php文件,放在配置目錄Conf下。

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

2.定義具體的功能

<?php
 /*
 * 定義行為: 在線更新
 */
 class OnlineCheckBehavior extends Behavior {
  //行為參數(shù)
  protected $options = array(
    'ONLINE_CHECK' => true, // 默認(rèn)進(jìn)行在線
    'ONLINE_CHECK_TIME' => 10, // 默認(rèn)5分鐘未活動(dòng),說(shuō)明已下線
  );
  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');
      // 先刪除在線表中 超過(guò)5分鐘未活動(dòng)的記錄
      //$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.在具體的登錄方法上添加

// 登錄檢測(cè)
  public function checkLogin() {
    // $this->redirect($url);
    $username = strtolower($this->_param('usr'));
    $pwd = $this->_param('pwd');
    $url = $this->_param('url'); // 目標(biāo)地址
    $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();
        // 檢測(cè)用戶是否在線
        if ($this->isOnline($list['id'])) {
          // <editor-fold defaultstate="collapsed" desc="if開(kāi)始">
          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()); //用戶最后點(diǎn)擊頁(yè)面時(shí)間 session超時(shí)使用
            ///
            $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);
            // 檢測(cè)是否有同一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 結(jié)束
        } else {
          $is_error = true;
          $this->assign('error_msg', '此用戶名已在其他電腦登陸,請(qǐng)' . C('ONLINE_CHECK_TIME') .'分鐘后再試!');
        }
      } else {
        $is_error = true;
        $this->assign('error_msg', '錯(cuò)誤的用戶名或口令!');
      }
    }
    if ($is_error) {
      $this->display('login');
    } else {
      $this->redirect('Index/index');
 //      if (empty($url)) {
 //        $this->redirect('Index/index');
 //      } else {
 //        $this->redirect($url);
 //      }
    }
  }
 /**
   * 檢測(cè)用戶是否在線
   * @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 { // 存在,檢測(cè)IP是否一致,否則,檢測(cè)是否超過(guò)5分鐘
      if ($list['lastip'] == $ip) {
        return true;
      } else {
        if ($list['lasttime'] < time() - C('ONLINE_CHECK_TIME') * 60) {
          return true;
        } else {
          return false;
        }
      }
    }
  }

以上就是具體的PHP在線狀態(tài)檢測(cè),同一時(shí)間只有一個(gè)用戶可以存在,不過(guò)還沒(méi)有考慮到非正常掉線等,cookie,session意外的處理,但是先分享出來(lái)吧

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

來(lái)源:腳本之家

鏈接:https://www.jb51.net/article/199383.htm

申請(qǐng)創(chuàng)業(yè)報(bào)道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!

相關(guān)標(biāo)簽
php教程

相關(guān)文章

  • PHP8的數(shù)據(jù)類型轉(zhuǎn)換-PHP8知識(shí)詳解

    什么是數(shù)據(jù)類型轉(zhuǎn)換?答:數(shù)據(jù)從一個(gè)類型轉(zhuǎn)換成另外一個(gè)類型,就是數(shù)據(jù)類型轉(zhuǎn)換。在PHP8中,變量的類型就是由賦值決定的,也就是說(shuō),如果string賦值給$var,然后$var的類型就是string。之后將int值賦值給$var,它將是int類型。列如:在上面的代碼中的“=”不是數(shù)學(xué)里面的“等于”,它是

    標(biāo)簽:
    php教程
  • 在PHP8中檢測(cè)數(shù)據(jù)類型-PHP8知識(shí)詳解

    在PHP8中,可以使用多種方法來(lái)檢測(cè)數(shù)據(jù)類型。以下是常用的四種方法:使用gettype()函數(shù)、使用is_*系列函數(shù)、使用get_debug_type()函數(shù)、使用get_class()函數(shù)。一、使用gettype()函數(shù)gettype()函數(shù)返回給定變量的數(shù)據(jù)類型。例如:二、使用is_*系列函數(shù)P

    標(biāo)簽:
    php教程
  • PHP語(yǔ)言優(yōu)勢(shì)-PHP8知識(shí)詳解

    PHP起源于自由軟件,并且得到了不斷的迭代更新,在web開(kāi)發(fā)領(lǐng)域獨(dú)領(lǐng)風(fēng)騷,得到了廣大使用者的喜愛(ài),PHP作為一款優(yōu)秀的腳本語(yǔ)言,具有以下優(yōu)勢(shì):1、源碼開(kāi)源:所有的PHP源代碼,你都能從PHP官方網(wǎng)站下載到,可以快速修改和利用。2、完全免費(fèi):你可以從PHP官方網(wǎng)站下載源碼完全免費(fèi),無(wú)需支付任何費(fèi)用,直

    標(biāo)簽:
    php教程
  • PHP8的新特性-PHP8知識(shí)詳解

    PHP8是PHP編程語(yǔ)言的一個(gè)主要版本,在2020年11月26日發(fā)布。它引入了許多新特性和改進(jìn),包括以下一些主要特性:1.JIT編譯器:PHP8引入了名為TracingJIT的即時(shí)(Just-In-Time)編譯器。JIT可以將PHP腳本中頻繁執(zhí)行的部分編譯成原生機(jī)器碼,提高執(zhí)行速度。2.類型系統(tǒng)改

    標(biāo)簽:
    php教程
  • PHP是什么-PHP8知識(shí)詳解

    PHP是什么?PHP服務(wù)網(wǎng)從下面幾點(diǎn)為你講清楚什么是PHP。1、PHP最開(kāi)始是PersonalHomePage(個(gè)人主頁(yè))的縮寫,已經(jīng)正式更名為“PHP:HypertextPreprocessor”,超文本預(yù)處理器的字母縮寫。2、PHP是一種被廣泛應(yīng)用的、跨平臺(tái)、開(kāi)放源代碼的多用途服務(wù)器端腳本語(yǔ)言,

    標(biāo)簽:
    php教程

熱門排行

信息推薦