免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zagorot
打印 上一主题 下一主题

[性能] php写的B/S应用系统中如何限制系统用户数? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2005-11-30 18:11 |只看该作者
开发语言本身做不到限制用户数,我说的任何话题都没指程序破解。

限制用户数必须在服务器上做限制,不是应用程序做的,你php写的程序如何能知道,现在
有多少人并发?


用任何语言都无法做到。
php做不到评什么编译语言能做。

论坛徽章:
0
32 [报告]
发表于 2005-11-30 20:00 |只看该作者
这个和语言无关,但可以通过程序实现这样的功能。

假设你是一个内部的 OA 系统,那么每个用户登录以后就在数据库里面插入一条记录,标明该用户的登录时间和id。用户每进行一个操作,都更新一次这个记录(更新操作要放到一个单独的模块中)。当用户注销的时候,删除这个记录。(异常情况稍后再说)
如果另一个用户尝试使用相同的用户名登录时,如果在线记录已经存在,就不允许登录。

通过这种机制,可以有几种办法限制用户数:

1、并发登录数。处理登录时,统计一下在线记录有多少,超过上限就禁止登录。
2、总用户数。由于每个用户只能在一个地方登录,所以可以配置用户管理模块,限制用户总数。


下面说说异常情况:用户断线或者未注销的情况下关闭了浏览器窗口,怎么办?
这种情况很常见,但具体情况又分两种。假设用户断线仅仅几分钟,那么 SESSION 中保存的用户数据肯定没有失效,用户继续操作就行了。完全没有影响。

如果用户关闭了窗口或者断线时间太长,导致 SESSION 失效,那么用户的在线记录就变成多余的了。这种记录只能在更新用户在线记录模块中删除在线超时的记录。至于删除时机,可以是在更新在线记录时,或者处理登录时。

例如用户 18:00:00 登录,用了5分钟,不小心关闭了窗口。这时在线记录的时间就是 18:05:00。当下一次批量删除超时在线记录时,如果发现某条在线记录时间超过了 5 分钟,则自动删除该记录。这样用户就能再次登录了。至于这个超时长度设置多少合适,就根据应用来定了。但短一点好。

OK,批量删除解决了第一种异常情况,但又带来了另一个问题:如果用户在发表文章,打字的时间超过了超时长度,那么用户的在线记录就会被删除。用户岂不是必须再次登录?

完全不会。首先,用户登录后,SESSION 中就保存了用户的登录信息(而SESSION的失效时间可以设置得长一点)。当用户进行任何操作时,应用程序是判断 SESSION 中的数据是否有效。如果有效,就更新在线记录,并处理用户请求的操作。这样即便用户的在线记录因为超时被删除了,也不会导致用户被强行注销。



这个方案是我看到lz的帖子后根据论坛在线用户统计想出来的,肯定有不完善的地方,希望大家指正补充。

论坛徽章:
0
33 [报告]
发表于 2005-11-30 21:51 |只看该作者
楼上朋友想法和我一致
看看很多Php论坛就知道了,翻翻限制用户数这段代码就差不多了

论坛徽章:
0
34 [报告]
发表于 2005-12-01 09:12 |只看该作者
原帖由 dualface 于 2005-11-30 20:00 发表
这个和语言无关,但可以通过程序实现这样的功能。

假设你是一个内部的 OA 系统,那么每个用户登录以后就在数据库里面插入一条记录,标明该用户的登录时间和id。用户每进行一个操作,都更新一次这个记录(更新操 ...


顶,非常感谢!

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
35 [报告]
发表于 2005-12-01 09:19 |只看该作者
原帖由 zagorot 于 2005-11-30 18:04 发表


哈哈,有趣. 我觉得可以做到啊. 比如不考虑效率和其他因素,一个最笨的办法就是在数据库里面保存每一个登陆用户的信息,这样我当然可以知道并控制登陆用户的数量了啊.

我估计,我们可能脑袋里面想的不是同样一 ...


我也在想,我现在居然耐心这么好,成熟了。

用数据库保存每一个登陆用户的信息,这方法和开发语言有什么关系。

而且你说的是限制并发用户数,并发用户并不是在线用户。

也许你根本不明白并发用户和在线用户的区别。

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
36 [报告]
发表于 2005-12-01 09:28 |只看该作者
原帖由 dualface 于 2005-11-30 20:00 发表
这个和语言无关,但可以通过程序实现这样的功能。

假设你是一个内部的 OA 系统,那么每个用户登录以后就在数据库里面插入一条记录,标明该用户的登录时间和id。用户每进行一个操作,都更新一次这个记录(更新操 ...


不满足需求的地方

1。要求是限制并发用户数,不是在线用户。
2。没法加密直接就被破解。

3。用户关闭窗口或者断线你是和用户在窗口不点击一样处理吗?

4。
  1. 用户登录后,SESSION 中就保存了用户的登录信息(而SESSION的失效时间可以设置得长一点)。当用户进行任何操作时,应用程序是判断 SESSION 中的数据是否有效。如果有效,就更新在线记录,并处理用户请求的操作。这样即便用户的在线记录因为超时被删除了,也不会导致用户被强行注销。
复制代码


这多少有的和你说单一接口的优点一样,完全是想象出来的。php如何能判断 SESSION 中的数据有效?
后台根本无法区分关闭窗口和用户超时的区别

论坛徽章:
0
37 [报告]
发表于 2005-12-01 09:54 |只看该作者
不满足需求的地方
1。要求是限制并发用户数,不是在线用户。


第一,每个用户账号同一时间只能在一个地方登录,然后再限制同时登录人数,自然就限制了并发用户数。

2。没法加密直接就被破解。


我这个是实现的思路,要达到好的效果当然要加密了。

3。用户关闭窗口或者断线你是和用户在窗口不点击一样处理吗?


我前面说了,SESSION 有失效时间、用户的在线记录也有失效时间。

SESSSION 的失效时间可以设置为 45 分钟或者 1 小时。这样即使用户很多在打字输入内容,也不会被强制注销登录。

而用户的在线记录失效时间就可以设置得很短,例如 5 分钟。这样用户即便不小心关闭了窗口,最多等 5 分钟就能再次登录了。

用户登录后,SESSION 中就保存了用户的登录信息(而SESSION的失效时间可以设置得长一点)。当用户进行任何操作时,应用程序是判断 SESSION 中的数据是否有效。如果有效,就更新在线记录,并处理用户请求的操作。这样即便用户的在线记录因为超时被删除了,也不会导致用户被强行注销。

这多少有的和你说单一接口的优点一样,完全是想象出来的。php如何能判断 SESSION 中的数据有效?
后台根本无法区分关闭窗口和用户超时的区别


你到底用没用过 php 的 session 啊?

论坛徽章:
0
38 [报告]
发表于 2005-12-01 10:01 |只看该作者
原帖由 北京野狼 于 2005-11-23 14:03 发表
连接的并发和php没有任何关系,
和Zend更没有任何联系
session控制的也只是所谓的在线用户



如果 lz 要求的限制同时访问网站的用户数,那么我的方案稍加修改即可。


首先,任何一个用户访问网站,都会获得一个 session_id。
然后替换掉 php 默认的 session 管理,改为将 session 信息保存到数据库中。

这样就能很容易的统计 session 记录总数,从而限制并发访问数。

这个方案有个特点(在lz的需求里面不一定是缺点):

如果每个用户只是上来看看文章,就关闭窗口了,那么就要把 session 失效时间设置得很短。但这样一来,如果用户看文章花多了时间,他的 session 就会失效。如果这时正好另外进来几个用户,达到了并发访问上限,那么这个用户看其他文章就会被拒绝。

既然本来的要求就是要限制并发访问,超过访问上限是因为用户购买的版本太低,那么无法访问也是理所当然的。

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
39 [报告]
发表于 2005-12-01 10:01 |只看该作者
原帖由 dualface 于 2005-12-1 09:54 发表


第一,每个用户账号同一时间只能在一个地方登录,然后再限制同时登录人数,自然就限制了并发用户数。


这不是真正的并发,而且LZ所说的用户数,未必就是登陆用户。LZ没有用户账号只能登陆一次的要求。
而且你后面的方案根本控制不了是否一次登陆。
并发只能在防火墙和web服务器上限制。

我前面说了,SESSION 有失效时间、用户的在线记录也有失效时间。

SESSSION 的失效时间可以设置为 45 分钟或者 1 小时。这样即使用户很多在打字输入内容,也不会被强制注销登录。

而用户的在线记录失效时间就可以设置得很短,例如 5 分钟。这样用户即便不小心关闭了窗口,最多等 5 分钟就能再次登录了。


你到底是如何区分出来关闭窗口和用户操作超时。  请说清楚。
你是如何知道用户的在线记录的。                请说清楚。


我偶尔用过SESSION

[ 本帖最后由 北京野狼 于 2005-12-1 10:05 编辑 ]

论坛徽章:
0
40 [报告]
发表于 2005-12-01 10:13 |只看该作者
原帖由 北京野狼 于 2005-12-1 10:01 发表

这不是真正的并发,而且LZ所说的用户数,未必就是登陆用户。LZ没有用户账号只能登陆一次的要求。
而且你后面的方案根本控制不了是否一次登陆。
并发只能在防火墙和web服务器上限制。

你到底是如何区 ...



我后面补充了的,你没看到。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP