作者jjdai (jjdai)
看板i-enterprise
标题Re: [请益] 关於线上人数统计
时间Sun Oct 14 22:51:08 2007
※ 引述《pply (干 吃晚餐去~~)》之铭言:
: ※ 引述《pply (干 吃晚餐去~~)》之铭言:
: : 最近花了点时间设计一个线上人数统计的系统
: : 能够帮网站管理员统计各个网页的线上人数
: : 也能提供网页排名的资讯...像是 BBS 的热门看板一样
: : 不知道这样的服务有没有更大的空间可以发展
: : 一般站长会想使用这样的东西吗
: : 网站在这里~~
: : 还很阳春...我想应该还有很多改进空间...Orz....
: : http://www.incyght.com/
: 有人对技术面有兴趣/质疑....那我就说明一下好了
: 当使用者浏览包含提供 Code 的网页时
: 会送出一个包含原网页网址资讯的要求到伺服器上
: 例如把提供的 code 放在 www.yyy.com/index.htm 上
: 那麽就会把 www.yyy.com/index.htm 这个资讯送到伺服器
: Server 会处理使用者 IP 以及浏览的网址
: 纪录这个 IP 到访该网址,该网址人数 +1
: 同一个 IP 会离开或者是到访另外一个网页
: 如果到访另外一个网页....则做相对应的统计工作
: 如果离开....因为浏览器并不会主动通知伺服器使用者离开
: 所以这里会有一个 delay .....
: 我们让系统定期检查每一个 IP 多久没有更新
: 超过 delay 的时间就认定该 IP 离开....做相对应的统计工作
: delay 可以设长设短....
: 我们没办法知道 IP 没更新是为了什麽
: 可能在看一篇长篇小说,也可能只是把浏览器关掉,这倒是有进一步研究的空间~~
: 如果可以找到一个具有代表性的期望值是最理想的~~~
: 目前设定五分钟~~
: 这件事情可以很精确也可以不那麽精确
: 在 HTTP 的环境下不可能绝对准
: 不过还蛮够用了....大家可以使用来观察看看
: 总之不是玩弄大家的把戏...: )
如果网页是使用 PHP 来写的话,可以很容易做到基本的统计网站人数功能。
1. 去改写 session 的处理方式,例如以下是将原本存到 file 的 session 资料变成
存到 MySql之类的 (memory) db. (不想搞变化的话直接去存 session file 的目录
和子目录中数数看有几个档案即可知道有几条现存的连线):
去用 session_set_save_handler() 函式改写 session 在
open(),
close(),
read(),
write(),
destroy(),
Gc()
时的处理方式。
其中在 read() 时去更新目前的 timestamp 值;Gc() 时去检查该 session 是否
已经超过时间了(),超过者即删除之,现存数量即为目前连线数。
(有些细节请到网路上找相关资料)
2. 让连到网站的连线被纪录 session:
也就是在 xxx.php 中执行「session_start();」。
3. 预设的连线保留时间是设定在 php.ini 的 「session.gc_maxlifetime」栏位,
又其预设值是 1440 秒,也就是说一个 session 超过约 24 分钟没有动作的话,
"可能" 会被移除 (这里讲的是 "可能",因为垃圾收集机制不是每一次都会作用
的,网站越热门的,其状态越正确。See Also: session.gc_probability,
session.gc_divisor)。
经由上述变化处理,就可以很容易达成类似 BBS 的连线统计功能,可以有来源 IP,
连线数, idle 时间, ... 等 ,结果呈现可以参考以下 URL:
http://career.zhupiter.com/account/usrlst.php
--
jjdai
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.64.48.105
1F:→ BlackCrazy:这样作耗不耗资源? 10/14 23:31
2F:→ jjdai:启动session相对没有启用是比较耗资源,但自己去算也多少会 10/15 23:43
3F:→ jjdai:花费一些资源。使用mem. db. 去记session更耗,但跑起来应该 10/15 23:46
4F:→ jjdai:比较有效率,且可适用於分散式的server farm。这方法用於 10/15 23:48
5F:→ jjdai:为了要实现类似 BBS 使用者列表的功能时,可能比较适合>< 10/15 23:54