Heim >Backend-Entwicklung >PHP-Problem >PHP prüfen, ob online

PHP prüfen, ob online

尚
Original
2019-10-30 14:06:262495Durchsuche

PHP prüfen, ob online

So überprüfen Sie, ob der Benutzer in PHP online ist:

Erstellen Sie zunächst eine neue tags.php-Datei und legen Sie diese im Konfigurationsverzeichnis Conf ab.

<?php
 /*
 * 添加行为
 *
 */
 return array(
    &#39;action_begin&#39; => array(&#39;OnlineCheck&#39;),
 );
 ?>

Spezifische Funktionen definieren

<?php
 /*
 * 定义行为: 在线更新
 */
 class OnlineCheckBehavior extends Behavior {
    //行为参数
    protected $options = array(
        &#39;ONLINE_CHECK&#39; => true, // 默认进行在线
        &#39;ONLINE_CHECK_TIME&#39; => 10, // 默认5分钟未活动,说明已下线
    );
    public function run(&$params) {
        if (C(&#39;ONLINE_CHECK&#39;)) {
            // 更新session
            if ((session(&#39;?login_account&#39;)) && (time() - session(&#39;access_time&#39;) > 60)) {
                session(&#39;access_time&#39;, time());
            }
            // 在线更新
            $ip = ip2long(get_client_ip());
            $online = M(&#39;Online&#39;);
            // 先删除在线表中 超过5分钟未活动的记录
            //$sql = &#39; delete from __TABLE__  where  &#39;;
            $map[&#39;lasttime&#39;] = array(&#39;lt&#39;, time() - C(&#39;ONLINE_CHECK_TIME&#39;) * 60);
            $icount = $online->where($map)->delete();
            if (session(&#39;?login_account&#39;)) { // 如果是登录用户
                $map = array();
                $map[&#39;uid&#39;] = session(&#39;login_uid&#39;);
                $map[&#39;lastip&#39;] = $ip;
                $id = $online->where($map)->getField(&#39;id&#39;);
                if (empty($id)) { // 不存在在线记录,则清空session
                    session(null);
                } else {
                    $map = array();
                    $map[&#39;id&#39;] = array(&#39;eq&#39;, $id);
                    $data[&#39;lasttime&#39;] = time();
                    $data[&#39;lastip&#39;] = $ip;
                    $online->where($map)->save($data);
                }
            } else { // 不是登录用户  游客
                unset($map);
                $map[&#39;lastip&#39;] = array(&#39;eq&#39;, $ip);
                $id = $online->where($map)->getField(&#39;id&#39;);
                //dump($id);
                if (empty($id)) { // 不存在在线记录, 则添加
                    $data = array();
                    $data[&#39;uid&#39;] = 0;
                    $data[&#39;account&#39;] = &#39;Guest&#39;;
                    $data[&#39;nickname&#39;] = &#39;游客&#39;;
                    $data[&#39;lasttime&#39;] = time();
                    $data[&#39;lastip&#39;] = $ip;
                    $online->add($data);
                } else {
                    $map = array();
                    $map[&#39;id&#39;] = array(&#39;eq&#39;, $id);
                    $data[&#39;lasttime&#39;] = time();
                    $data[&#39;lastip&#39;] = $ip;
                    $online->where($map)->save($data);
                }
            }
        }
    }
 }
 ?>

// 登录检测
    public function checkLogin() {
        // $this->redirect($url);
        $username = strtolower($this->_param(&#39;usr&#39;));
        $pwd = $this->_param(&#39;pwd&#39;);
        $url = $this->_param(&#39;url&#39;); // 目标地址
        $is_error = false;
        if (empty($username) or empty($pwd)) {
            $this->assign(&#39;error_msg&#39;, &#39;用户名和口令不能为空&#39;);
            $is_error = true;
        }
        if (!$is_error) {
            $model = M(&#39;Usr&#39;);
            $map[&#39;account&#39;] = $username;
            $map[&#39;upwd&#39;] = strtoupper(md5($pwd));
            $icount = $model->where($map)->count();
            if ($icount == 1) {
                $list = $model->where($map)->find();
                // 检测用户是否在线
                if ($this->isOnline($list[&#39;id&#39;])) {
                    // <editor-fold defaultstate="collapsed" desc="if开始">
                    if ($list[&#39;status&#39;]) {
                        session(&#39;login_account&#39;, $username);
                        session(&#39;login_nickname&#39;, $list[&#39;nickname&#39;]);
                        session(&#39;last_time&#39;, toDate($list[&#39;last_time&#39;]));
                        if ($list[&#39;last_ip&#39;]) {
                            session(&#39;last_ip&#39;, long2ip($list[&#39;last_ip&#39;]));
                        } else {
                            session(&#39;last_ip&#39;, get_client_ip());
                        }
                        session(&#39;login_count&#39;, $list[&#39;login_count&#39;]);
                        session(&#39;login_uid&#39;, $list[&#39;id&#39;]);
                        session(&#39;login_pwd&#39;, $list[&#39;upwd&#39;]);
                        session(&#39;access_time&#39;, time());  //用户最后点击页面时间  session超时使用
                        ///
                        $map[&#39;id&#39;] = $list[&#39;id&#39;];
                        $data[&#39;last_time&#39;] = time();
                        $data[&#39;last_ip&#39;] = ip2long(get_client_ip());
                        $model->where($map)->save($data);
                        $model->where($map)->setInc(&#39;login_count&#39;, 1);
                        // 检测是否有同一IP的记录,有更新,否则 添加
                        $online = M(&#39;Online&#39;);
                        $map = array();
                        $map[&#39;lastip&#39;] = ip2long(get_client_ip());
                        $online_id = $online->where($map)->getField(&#39;id&#39;);
                        if (empty($online_id)) {
                            // 插入在线用户表
                            $data = array();
                            $data[&#39;uid&#39;] = $list[&#39;id&#39;];
                            $data[&#39;account&#39;] = $list[&#39;account&#39;];
                            $data[&#39;nickname&#39;] = $list[&#39;nickname&#39;];
                            $data[&#39;lasttime&#39;] = time();
                            $data[&#39;lastip&#39;] = ip2long(get_client_ip());
                            $online->add($data);
                        }else{
                             // 更新在线用户表
                            $data = array();
                            $data[&#39;uid&#39;] = $list[&#39;id&#39;];
                            $data[&#39;account&#39;] = $list[&#39;account&#39;];
                            $data[&#39;nickname&#39;] = $list[&#39;nickname&#39;];
                            $data[&#39;lasttime&#39;] = time();
                            //$data[&#39;lastip&#39;] = ip2long(get_client_ip());
                            $online->where($map)->save($data);
                        }
                    } else {
                        $is_error = true;
                        $this->assign(&#39;error_msg&#39;, &#39;此用户已被禁止登录!&#39;);
                    }
                    // </editor-fold>   if 结束
                } else {
                    $is_error = true;
                    $this->assign(&#39;error_msg&#39;, &#39;此用户名已在其他电脑登陆,请&#39; . C(&#39;ONLINE_CHECK_TIME&#39;) .&#39;分钟后再试!&#39;);
                }
            } else {
                $is_error = true;
                $this->assign(&#39;error_msg&#39;, &#39;错误的用户名或口令!&#39;);
            }
        }
        if ($is_error) {
            $this->display(&#39;login&#39;);
        } else {
            $this->redirect(&#39;Index/index&#39;);
 //            if (empty($url)) {
 //                $this->redirect(&#39;Index/index&#39;);
 //            } else {
 //                $this->redirect($url);
 //            }
        }
    }
  /**
     * 检测用户是否在线
     * @access private
     * @param int $uid 用户ID
     * @return Boolean true=不在线
     */
    private function isOnline($uid) {
        $ip = ip2long(get_client_ip());
        $online = M(&#39;Online&#39;);
        $map[&#39;uid&#39;] = array(&#39;eq&#39;, $uid);
        $list = $online->where($map)->find();
        if (empty($list)) { // 不存在
            return true;
        } else { // 存在,检测IP是否一致,否则,检测是否超过5分钟
            if ($list[&#39;lastip&#39;] == $ip) {
                return true;
            } else {
                if ($list[&#39;lasttime&#39;] < time() - C(&#39;ONLINE_CHECK_TIME&#39;) * 60) {
                    return true;
                } else {
                    return false;
                }
            }
        }
    }

zur spezifischen Anmeldemethode hinzufügen Empfohlen: PHP-Server

Das obige ist der detaillierte Inhalt vonPHP prüfen, ob online. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP-Fehlerprotokoll anzeigenNächster Artikel:PHP-Fehlerprotokoll anzeigen