PHP는 온라인인지 확인

풀어 주다: 2023-02-28 07:02:01
원래의
2444명이 탐색했습니다.

PHP는 온라인인지 확인

PHP에서 사용자가 온라인 상태인지 확인하는 방법:

먼저 새 Tags.php 파일을 만들고 구성 디렉터리 Conf에 넣습니다.

<?php
 /*
 * 添加行为
 *
 */
 return array(
    &#39;action_begin&#39; => array(&#39;OnlineCheck&#39;),
 );
 ?>
로그인 후 복사

특정 기능 정의

<?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;
                }
            }
        }
    }
로그인 후 복사

추가 권장: php 서버

위 내용은 PHP는 온라인인지 확인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!