使用php并发登录
我们正在开发一个web应用程序,预计至少有10000人同时登录。现在,我们正在努力解决以下问题: 目标-禁止并发登录(使用相同凭据登录) 解决方案-AJAX调用在javascript计时器上运行,以检查本地会话id和数据库中的会话id。请参阅详细说明 问题-由于在线人数众多,每10秒通过计时器点击服务器会在服务器上产生巨大的负载,即每秒最大连接数和不必要的客户端-服务器事务,即使没有并发登录 解决方案-除了我们目前的方法之外,还有其他方法来解决并发登录问题吗 非常感谢你的才华 有趣的问题 我想说的是,使用纯基于RAM的解决方案所能做的任何事情都可能最适合这种类型的问题。MySQL有一个基于RAM的存储引擎,但除此之外,MimCasHand和ReDIS都具有自动数据过期,并且可能具有优越的性能,因此我认为它们更适合。见和 如果你能确保你只击中RAM中的东西,我相信你已经赢了一半 除此之外,请仔细评估您真正需要客户“ping”的频率。如果用户空闲,那么客户端是否需要每10秒发送一次ping?会话到期后是否可以优雅地处理用户交互?(例如,让用户单击一个按钮,然后系统响应“您已经登录,请关闭另一个窗口”。如果用户没有花费很长时间将内容写入表单,但在提交后却发现他们已经注销,则这可能会起作用。) 最坏的情况是什么 尝试以下场景:使用php并发登录,php,javascript,ajax,timer,Php,Javascript,Ajax,Timer,我们正在开发一个web应用程序,预计至少有10000人同时登录。现在,我们正在努力解决以下问题: 目标-禁止并发登录(使用相同凭据登录) 解决方案-AJAX调用在javascript计时器上运行,以检查本地会话id和数据库中的会话id。请参阅详细说明 问题-由于在线人数众多,每10秒通过计时器点击服务器会在服务器上产生巨大的负载,即每秒最大连接数和不必要的客户端-服务器事务,即使没有并发登录 解决方案-除了我们目前的方法之外,还有其他方法来解决并发登录问题吗 非常感谢你的才华 有趣的问题 我想说
| 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 |
但这种延迟只有在最近有另一个客户端登录时才会发生,因此,如果典型用例中每个用户只有一个客户端,这不会造成严重问题。我们在我的一项工作中处理这一问题的方法是创建一个“会话”表,以跟上当前登录的用户。此表加载了诸如“登录时间”、“ip/mac地址”、“用户名”、“浏览器”等信息。。。基本上,关于用户的“会话”信息。所以,当进行登录时,它会检查这个表,看这个用户是否已经登录,如果已经登录,并且满足了新登录的凭据,那么我们会从会话表中删除旧的行并添加新的。后端是一个cron作业,每分钟运行一次以检查重复条目,总是先删除最旧的条目。更好的方法是将会话数据存储在redis中,如果有人再次登录,则删除会话。这将自动从上一个会话注销用户