我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何用PHP来统计在线人数

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何用PHP来统计在线人数

今天小编给大家分享一下如何用PHP来统计在线人数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

如何用PHP来统计在线人数

1 用表统计方式

用数据表统计在线人数,这种方式只能用在并发量不大的情况下。

首先我们先新建表:user_login

如何用PHP来统计在线人数

编辑

user_login 表

模拟用户登录,不存在用户就存入表,存在的则更新登录信息

// 客户端唯一的识别码$client_id = session()->getId();//用户是否已存在$user = DB::table('user_login')    ->where('token', $client_id)    ->first();//不存在则插入数据if (empty($user)) {    $data = [        'token' => $client_id,        'username' => 'user_' . $client_id, // 模拟用户        'uid' => mt_rand(10000000, 99999999),   //模拟用户id        'create_time' => date('Y-m-d H:i:s'),        'update_time' => date('Y-m-d H:i:s')    ];    DB::table('user_login')->insert($data);} else {        // 存在则更新用户登录信息    DB::table('user_login')     ->where('token', $client_id)     ->update([          'update_time' => date('Y-m-d H:i:s')      ]);}

这里还需要定期清理无任何操作的用户,假如用户一个小时内无任何操作,我们可以记为无效用户

代码如下:

// 客户端唯一的识别码$client_id = session()->getId();//用户是否已存在$user = DB::table('user_login')    ->where('token', $client_id)    ->first();//不存在则插入数据if (empty($user)) {    $data = [        'token' => $client_id,        'username' => 'user_' . $client_id, // 模拟用户        'uid' => mt_rand(10000000, 99999999),   //模拟用户id        'create_time' => date('Y-m-d H:i:s'),        'update_time' => date('Y-m-d H:i:s')    ];    DB::table('user_login')->insert($data);} else {        // 存在则更新用户登录信息    DB::table('user_login')     ->where('token', $client_id)     ->update([          'update_time' => date('Y-m-d H:i:s')      ]);}

我们可以实现的功能:

1)当前在线人数

2)某时间段内在线人数

3)最新上线的用户

4)指定用户是否在线

// 可实现功能一:当前总共在线人数$c = DB::table('user_login')->count();echo '当前在线人数:' . $c . '<br />';// 可实现功能二:某时间段内在线人数$begin_date = '2020-08-13 09:00:00';$end_date = '2020-08-13 18:00:00';$c = DB::table('user_login')    ->where('create_time', '>=', $begin_date)    ->where('create_time', '<=', $end_date)    ->count();echo $begin_date . '-' . $end_date . '在线人数:' . $c . '<br />';// 可实现功能三:最新上线的用户$newest = DB::table('user_login')    ->orderBy('create_time', 'DESC')    ->limit(10)    ->get();echo '最新上线的用户有:';foreach ($newest as $value) {    echo $value->username . ' ';}echo '<br />';// 可实现功能四:指定用户是否在线$username = 'user_1111';$online = DB::table('user_login')    ->where('username', $username)    ->exists();echo $username . ($online ? '在线' : '不在线');

2 使用 redis 有序集合实现在线人数统计

因为是内存中,所以效率很高,可以统计某个时间段内的在线人数,可以做各种聚合操作。但是如果在线人数比较多的情况下,会比较占用内存。还有一点:

无法通过用户操作时间清除掉无效用户,只有手动登出的用户才会从集合中删除。

代码如下:

// 客户端唯一的识别码$client_id = session()->getId();echo $client_id . '<br />';// 按日期生成key$day = date('Ymd');$key = 'online:' . $day;// 是否在线$is_online = Redis::zScore($key, $client_id);if (empty($is_online)) {    // 不在线,加入当前客户端    Redis::zAdd($key, time(), $client_id);}// 可实现功能一:当前总共在线人数$c = Redis::zCard($key);echo '当前在线人数:' . $c . '<br />';// 可实现功能二:某时间段内在线人数$begin_date = '2020-08-13 09:00:00';$end_date = '2020-08-13 18:00:00';$c = Redis::zCount($key, strtotime($begin_date), strtotime($end_date));echo $begin_date . '-' . $end_date . '在线人数:' . $c . '<br />';// 可实现功能三:最新上线的用户,时间从小到大排序$newest = Redis::zRangeByScore($key, '-inf', '+inf', ['limit' => [0, 50]]);echo '最新上线的用户有:';foreach ($newest as $value) {    echo $value . ' ';}echo '<br />';// 可实现功能四:指定用户是否在线$username = $client_id;$online = Redis::zScore($key, $client_id);;echo $username . ($online ? '在线' : '不在线') . '<br />';// 可实现功能五:昨天和今天都上线的客户$yestoday = Carbon::yesterday()->toDateString();$yes_key = str_replace('-', '', $yestoday);$members = [];Redis::pipeline(function ($pipe) use ($key, $yes_key, &$members) {    Redis::zinterstore('new_key', [$key, $yes_key], ['aggregate' => 'min']);    $members = Redis::zRangeByScore('new_key', '-inf', '+inf', ['limit' => [0, 50]]);    //dump($members);});echo '昨天和今天都上线的用户有:';foreach ($members as $value) {    echo $value . ' ';}

3 使用 hyperloglog 做统计

跟有序集合方式不同,hyperloglog 十分节约空间,但是实现的功能也非常单一,只能统计在线人数,不能实现其余的任何功能。

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

// note HyperLogLog 只需要知道在线总人数for ($i=0; $i < 6; $i++) {    $online_user_num = mt_rand(10000000, 99999999);     //模拟在线人数    var_dump($online_user_num);    for ($j=1; $j < $online_user_num; $j++) {         $user_id = mt_rand(1, 100000000);        $redis->pfadd('002|online_users_day_'.$i, [$user_id]);    }}$count = 0;for ($i=0; $i < 3; $i++) {     $count += $redis->pfcount('002|online_users_day_'.$i);    print_r($redis->pfcount('002|online_users_day_'.$i). "\n");}var_dump($count);//note  3 days total online numvar_dump($redis->pfmerge('002|online_users_day_both_3', ['002|online_users_day_0', '002|online_users_day_1', '002|online_users_day_2']));var_dump($redis->pfcount('002|online_users_day_both_3'));

这种方案仅仅只能统计出某个时间段在线人数的总量, 对在线用户的名单却无能为力,但是却挺节省内存的,对统计数据要求不多情况下 ,我们便可以考虑这种方案。

4 使用 bitmap 统计

bitmap 就是通过一个 bit 位来表示某个元素对应的值或者状态,其中的 key 就是对应元素本身。我们知道 8 个 bit 可以组成一个 Byte,所以 bitmap 本身会极大的节省储存空间。

bitmap 常用来做比如用户签到、活跃用户、在线用户等功能。

代码如下

// 模拟当前用户$uid = request('uid');$key = 'online_bitmap_' . date('Ymd');// 设置当前用户在线Redis::setBit($key, $uid, 1);// 可实现功能1:在线人数$c = Redis::bitCount($key);echo '在线人数:' . $c . '<br />';// 可实现功能2:指定用户是否在线$online = Redis::getBit($key, $uid);echo $uid . ($online ? '在线' : '不在线') . '<br />';// 可实现功能3:昨天和今天均上线的用户总数$yestoday = Carbon::yesterday()->toDateString();$yes_key = str_replace('-', '', $yestoday);$c = 0;Redis::pipeline(function ($pipe) use ($key, $yes_key, &$c) {    Redis::bitOp('AND', 'yest', $key, $yes_key);    $c = Redis::bitCount('yest');});echo '昨天和今天都上线的用户数量有:' . $c . '<br />';

bitmap 消耗的内存空间不多, 统计的信息却挺多的,这种方案是值得推荐一下的。

以上就是“如何用PHP来统计在线人数”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何用PHP来统计在线人数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何用PHP来统计在线人数

今天小编给大家分享一下如何用PHP来统计在线人数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 用表统计方式用数据表统计在
2023-07-02

PHP+REDIS如何统计在线人数

小编给大家分享一下PHP+REDIS如何统计在线人数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在线人数统计业务是我们开发web肯定要设计的业务逻辑,本文就会给
2023-06-14

用PHP来统计在线人数的四个方法详解

本篇文章给大家带来了关于PHP的相关知识,其中主要介绍了怎么实现统计在线人数的问题,可以利用表统计方式、用redis有序集合统计、用hyperloglog做统计等等,下面一起来看一下,希望对大家有帮助。一个业务系统网站每天人数的访问量是多少,在线人数是多少?这种业务我们在开发中就要预留,也是在我们的设计范围内的咯!因为一个正在运营的网站,每天都会用到统计。那在线人数是如何统计的呢,这里有几种方案,代
2022-06-14

如何提升 Discuz 论坛在线人数统计的准确性

提升 Discuz 论坛在线人数统计的准确性Discuz 是一款功能强大的论坛系统,广泛应用于各大网站社区。在 Discuz 论坛中,在线人数统计是一个非常重要的指标,可以帮助管理员了解论坛的活跃程度和流量情况。然而,在实际应用过程中,由
如何提升 Discuz 论坛在线人数统计的准确性
2024-03-11

java web监听器统计在线用户及人数

在线用户使用HttpSessionListener监听器统计 每当一个session会话建立 在线用户人数+1每当一个session会话销毁 在线用户人数-1使用ServletRequestListener监听器统计用户信息每当一个re
2023-05-31

java如何统计当前在线数

这篇文章主要介绍了java如何统计当前在线数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java统计当前在线数package com.hnedu.stat;/** * 计算
2023-06-03

Discuz 在线人数统计功能的设置技巧

Discuz 在线人数统计功能的设置技巧,需要具体代码示例随着互联网的发展,网站的在线人数统计功能逐渐成为了网站管理者必备的功能之一。Discuz 是一款非常流行的论坛程序,其在线人数统计功能的设置非常重要,能够为网站管理者提供实时的访问
Discuz 在线人数统计功能的设置技巧
2024-03-10

portlet中关于统计在线人数的示例分析

小编今天带大家了解portlet中关于统计在线人数的示例分析,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“portlet中关于统计在
2023-06-03

如何设计MySQL表结构来支持在线考试系统?

如何设计MySQL表结构来支持在线考试系统?随着互联网的快速发展,越来越多的教育机构和企业开始采用在线考试系统来进行考试。而一个高效可靠的在线考试系统离不开一个合理的数据库设计。本文将介绍如何设计MySQL表结构来支持在线考试系统,并提供具
如何设计MySQL表结构来支持在线考试系统?
2023-10-31

如何利用ChatGPT PHP开发在线咨询机器人

如何利用ChatGPT PHP开发在线咨询机器人引言:随着人工智能的快速发展,机器人咨询正在变得越来越普遍。而开发一个在线咨询机器人可以通过ChatGPT PHP轻松实现。本文将带领读者了解如何利用ChatGPT PHP开发在线咨询机器人,
2023-10-27

如何设计MySQL表结构来支持在线考试系统的考试成绩统计?

如何设计MySQL表结构来支持在线考试系统的考试成绩统计?简介在线考试系统是现代教育的重要组成部分之一。为了对学生的考试成绩进行统计和分析,需要设计适合的数据库表结构来存储考试信息。本文将介绍如何设计MySQL表结构来支持在线考试系统的考试
如何设计MySQL表结构来支持在线考试系统的考试成绩统计?
2023-10-31

如何在线学习 PHP 函数?

使用在线平台(如 w3schools、geeksforgeeks)学习 php 函数,从基本函数(如 echo)开始,逐步探索字符串、数组、日期函数,并练习实战案例(如使用 echo 打印信息、使用 strlen 获取字符串长度)。通过持续
如何在线学习 PHP 函数?
2024-04-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录