REPLACE INTO xx_session (user_id, expire, ip)VALUES(10, 1000000000, 102933800);
3、 用户退出时:
DELETE FROM xx_session WHERE user_id=10;
4、 在线用户过期,可以通过 Mysql 的 Event Scheduler 来定时删除过期用户:
CREATE DEFINER=`root`@`%` EVENT `30minute` ON SCHEDULE EVERY 30 MINUTE STARTS '2012-05-30 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN
DELETE FROM xx_session WHERE expire<= UNIX_TIMESTAMP();
END;
实时性要求不那么高的话,就基于当前有效的session数量(基于cookie)
实时性要求高的话,使用websocket统计连接数
首先,得确定一下什么是在线,简单的做法就是固定时间比如5分钟内活动的都算在线。
剩下的就简单咯,记录一下用户最后活跃时间(页面刷新或者ajax都行),需要统计时count出距离当前时间<=5min的。
记录Session数量即可
统计session数量,统计时间跨度取决于session生命期。
利用文件+cookie,循环遍历文件中cookie个数。 不过既然你有redis,也可以直接用redis 替代文件读写。
php统计在线人数
我们不用cookie和服务器端session,但刚好有这个需求,最后是用websocket看的,原以为很麻烦,没想到还挺容易的
我常用的一个方法:
1、 建立一张 mysql 的内存表(优秀的读写性能以及快速增删)
user_id:用户id
expire:用于告诉系统过期时间
ip:ip2long 转成的整型ip
附:内存表有一个问题,就是重启后所有数据会消失。这点在使用中请务必注意。
2、用户每次操作时 replace into 进内存表:
3、 用户退出时:
4、 在线用户过期,可以通过 Mysql 的 Event Scheduler 来定时删除过期用户:
注意:
mysql 要启用 Event Scheduler:
查看是否启动:
启动方法1(不重启,但重启失效):
启动方法2(永久生效),在 mysql 启动时加上:
启动方法3(永久生效),在 my.cnf 中、[mysqld]里,加入: