用php同时登录

时间:2013-06-18 17:12:33

标签: php javascript ajax timer

我们正在开发一个Web应用程序,该应用程序应该至少有10,000个人同时登录。现在,我们正在尝试解决以下问题,

目标 - 禁止并发登录(使用相同凭据登录)

已解决的解决方案 - AJAX调用在javascript计时器上运行,以检查数据库中的本地会话ID和会话ID。有关详细说明,请参阅avoid concurrent login

问题 - 由于网上有大量人员,每10秒钟通过一个计时器点击服务器就会在最大连接/秒和不必要的客户端 - 服务器事务方面对服务器造成巨大负担,即使没有并发登录也是如此。

解决方案 - 除了我们当前修复并发登录问题的方法之外,还有其他方法。

非常感谢您的光彩!!! ...

1 个答案:

答案 0 :(得分:0)

有趣的问题。

我会说,使用纯RAM解决方案可以做的任何事情都可能是最适合这类问题的。 Mysql有一个基于RAM的存储引擎,但除此之外,memcached和redis都具有自动数据到期并且可能具有卓越的性能,因此我认为它们更适合。请参阅Redis expirememcached expiration

如果你能确保你只是在RAM中击中了东西,我相信你已经赢得了一半的战斗。

除此之外,请仔细评估您真正需要从客户那里“ping”的频率。如果用户空闲,那么客户端是否必须每10秒发送一次ping操作?是否可以在会话到期后优雅地处理用户交互? (例如让用户单击一个按钮,然后系统响应“您已经登录的内容”,请关闭另一个窗口。)如果用户不花很长时间将内容写入表单,这可能会有效。只是发现他们提交后已经退出。)

最糟糕的情况是什么?

尝试这种情况:

| time | Client 1    | Client 2 | Server                     |
|   t0 | Log in      |          |                            |
|   t1 |             |          | Authorize client 1 session |
|   t2 | Send ping   |          |                            |
|   t3 |             |          | Update client 1 session    |
|   t4 |             | Log in   |                            |

让我们说t3和t4之间的时间是1秒。在那种情况下接下来发生的是:

|   t5 |             |          | Server rejects client 2    |

如果t3和t4之间的时间是20秒并且ping间隔是10秒,我们将假设客户端1已经消失并且:

|   t5 |             |          | Delete client 1 session    |
|   t6 |             |          | Authorize client 2 session |

但是您可以使用具有更长ping时间间隔的模型,并在客户端登录之前引入可能的延迟。假设ping时间为60秒,t3和t4之间的时间为30秒:

| t4+30| Send ping   |          |                            |
|   t5 |             |          | Server rejects client 2    |

或者 - 如果客户1已经离开,

| t4+30|             |          | Delete client 1 session    |
|   t6 |             |          | Authorize client 2 session |

但是这种延迟只会在最近从另一个客户端登录时发生,所以如果典型用例每个用户只有一个客户端,则不会造成严重问题。