这里我使用的方法是通过记录5分钟内,访问网站的用户的IP地址,来判断当前在线人数。

在线人数

首先我们需要两个函数,一个是获取客户端IP的函数

    /**
     * 获取客户端IP
     * @return string
     */
    function getip() { //获取客户端IP
        if ( isset($_SERVER[ "HTTP_CDN_SRC_IP" ]) ) { //获取网宿CDN真实客户IP
            return replace_ip( $_SERVER[ "HTTP_CDN_SRC_IP" ] );
        }
        if ( isset($_SERVER[ "HTTP_X_FORWARDED_FOR" ]) ) { //获取网宿、阿里云真实客户IP,参考:https://help.aliyun.com/knowledge_detail/40535.html
            return replace_ip( $_SERVER[ "HTTP_X_FORWARDED_FOR" ] );
        }
        if ( isset($_SERVER[ "HTTP_CLIENT_IP" ]) ) {
            return $_SERVER[ "HTTP_CLIENT_IP" ];
        }
        if ( isset($_SERVER[ "HTTP_X_FORWARDED" ]) ) {
            return $_SERVER[ "HTTP_X_FORWARDED" ];
        }
        if ( isset($_SERVER[ "HTTP_FORWARDED_FOR" ]) ) {
            return $_SERVER[ "HTTP_FORWARDED_FOR" ];
        }
        if ( isset($_SERVER[ "HTTP_FORWARDED" ]) ) {
            return $_SERVER[ "HTTP_FORWARDED" ];
        }
        $httpip = $_SERVER[ 'REMOTE_ADDR' ];
        if ( !preg_match( "/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/", $httpip ) ) {
            $httpip = "127.0.0.1";
        }
        return $httpip;
    }

还有一个是拆分代理IP函数

    /**
     * 拆分代理IP
     * @return string
     */
    function replace_ip($ip)
    {
    
        if (!$ip) {
            return "";
        }
    
        $httpip_array = explode(",", $ip);
    
        if ($httpip_array[0]) {
    
            return $httpip_array[0];
    
        } else {
    
            return $ip;
    
        }
    
    }

接着便是主要代码:

    /**
     * 
     * 用户在线数量统计
     * 
     * */
    // 获取用户 IP 地址
    $userIP = getip();
    // 获取当前时间戳
    $currentTime = $date;
    // 设置在线时间间隔(5分钟)
    $timeout = $currentTime - (5 * 60);
    // 创建或打开文件以保存在线用户数据
    $file = fopen("online_users.txt", "c+");
    // 获取文件中的数据
    $users = unserialize(fread($file, filesize("online_users.txt")));
    // 如果用户数据不是数组,则初始化为空数组
    if (!is_array($users)) {
        $users = [];
    }
    // 更新当前用户的在线时间
    $users[$userIP] = $currentTime;
    // 删除超时的用户
    foreach ($users as $ip => $lastTime) {
        if ($lastTime < $timeout) {
            unset($users[$ip]);
        }
    }
    // 重置文件指针,并清空文件内容
    ftruncate($file, 0);
    rewind($file);
    // 将更新后的用户数据写入文件
    fwrite($file, serialize($users));
    // 关闭文件
    fclose($file);
    //在线人数
    $online_users = count($users);

最后这个变量 $online_users 就是在线人数了,放到想要输出的位置,进行输出即可。

在线人数 <?php echo $online_users;?> 人