关于论坛在线用户显示模块实现的问题。

anfield 2002-07-29 05:21:22
关于论坛在线用户显示模块实现的问题。

我的论坛(http://ynwa.yeah.net)关于实现在线用户的模块是这样建立的(只讲原理,由于代码镶嵌在html里面,过于发散,不在这里列出):当用户登陆时(打开我的论坛页面),把用户的登陆时间(精确到秒)记录到数据库该用户的相应列上。每个论坛页面都有一个隐藏的页面,该隐藏页面每隔30秒刷新一次,当用户端的浏览器自动刷新时,把服务器的当前时间更新到登陆时间的列上,同时用服务器的当前时间减去其他在线用户的登陆时间(或者是已经更新的时间),如果差值大于40秒,证明该用户的浏览器已经在远大于30秒的时间内没有刷新页面,也就意味着该用户已经离线。(因为在线的话,客户端的浏览器一定会在30秒内自动刷新以更新登陆时间),同时删除该用户的登陆时间,以表示他离线。实际上,这个功能在我的论坛经过实践成功实现了。但有一个问题我解决不了,就是当最后一个用户离线时,也就是说没有一个客户端打开我论坛的任何页面时,就没有页面会自动刷新了,也就是说,在最后一个用户离线后,如果没有新用户登陆,即使过多长时间,页面也不会更新数据库,把该离线用户的登陆时间删除(我用查看用户的登陆时间列是否为NULL来判断用户是否在线)。那么假设经过2小时后,一个用户登陆论坛,就会发现还有一个用户在线,实际上该用户已经离开了2个小时。
请问这个问题我怎么解决呢?是不是可以在服务器端设定页面的定时刷新,还有其他不干涉服务器端的方法吗?

...全文
2 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
CHARGING 2003-01-13
假如最后一個用戶兩小時之前离線,下一個用戶來到論壇首頁時清理用戶就可以了.
回复
anfield 2002-08-03
楼上的兄台还是没有完全理解我的意思,看来我的表达力还有待提高。

“而且其它访问者更不能对这个会员的在线时间进行检索。这不跟跟没做一样嘛?”
不是,我都说,每个客户端的浏览器自动刷新时,都会删除时间差超过40秒的在线用户。问题是最后一个退出后,没有客户端浏览器自动刷新,就不能删除最后一个的数据了。


回复
imatree 2002-07-31
既然大家没搞懂你的意思,也就是表明了你没叙述清楚,不可能所有人都犯错误吧?

你的意思我很明白,但是你的方法不正确,可以说你是基于个人的在线程序,也就是说一个会员离开后,就不能对它的数据进行删除了,而且其它访问者更不能对这个会员的在线时间进行检索。这不跟跟没做一样嘛?

我建议你在关闭浏览器时像新浪一样打开一个新窗口,连接到一个数据删除程序,这样是最好了。但是要考虑到用户打开多个浏览器的情况,还有用户强行断线的情况。

最好的方法还是历遍数据录,删除超过40秒的数据,但这样绝对是超级消耗系统资源,以我现在的智商只能想到这么做了。

还有建议你把时间设置成3分钟一刷新、超过五分钟删除数据的方法,我有实际使用经验,这样既节约系统资源,精确度又高。
回复
alexxing 2002-07-31
如果你有足够的权限,可以在服务器端定时执行SHELL脚本清理数据库,不过估计不大现实
“最后一个用户”离线后的工作,只能在下一个用户登陆时解决
回复
anfield 2002-07-31
怎么大家没有搞懂我的意思呢?
回复
LeeMaRS 2002-07-30
怎么会被清理掉? 只清理超过40秒的啊.
回复
anfield 2002-07-30
但如果任何用户一登陆,就清理整个表,会导致明明在线的用户都被“无辜”的清除掉,那么任何人登陆都会发现论坛只有他一个人。
回复
laosan 2002-07-30
真正的用户在线是做不到的。

我们得到的只是一段时间的近似值。
也就是说足够短的时间来判断。
不过越精确的话,服务器的压力就越大。

这时用户在线的准确判断与服务器压力之间不可调和的矛盾。
回复
alexxing 2002-07-29
任何一个用户登陆的时候,先“清理”一下整个表

delete from logtable where $time > refresh_time+40

然后再进行其它操作
回复
LeeMaRS 2002-07-29
其实不是很简单? 当一个用户登录的时候, 就判断此时时间与数据库中所有的人的最后刷新时间的差,超过40秒的就干掉呀.

就是经典的用户在线.
回复
anfield 2002-07-29
: LeeMaRS(小菜虎_水壶的仇人:你没有看懂我的意思,我不是说最后一个离开后,我的页面不会自动刷新了吗?
回复
wasy 2002-07-29
设定session在服务器中存在的时间或者在页面关闭的时候打开注销页面
回复
LeeMaRS 2002-07-29
?不是判断超过40秒就被删除了吗? 怎么2小时后新上来的用户却不进行这个判断呢? 程序执行流程没控制好吧.
回复
发动态
发帖子
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
社区公告
暂无公告