Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php并发登录_Php_Javascript_Ajax_Timer - Fatal编程技术网

使用php并发登录

使用php并发登录,php,javascript,ajax,timer,Php,Javascript,Ajax,Timer,我们正在开发一个web应用程序,预计至少有10000人同时登录。现在,我们正在努力解决以下问题: 目标-禁止并发登录(使用相同凭据登录) 解决方案-AJAX调用在javascript计时器上运行,以检查本地会话id和数据库中的会话id。请参阅详细说明 问题-由于在线人数众多,每10秒通过计时器点击服务器会在服务器上产生巨大的负载,即每秒最大连接数和不必要的客户端-服务器事务,即使没有并发登录 解决方案-除了我们目前的方法之外,还有其他方法来解决并发登录问题吗 非常感谢你的才华 有趣的问题 我想说

我们正在开发一个web应用程序,预计至少有10000人同时登录。现在,我们正在努力解决以下问题:

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

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

问题-由于在线人数众多,每10秒通过计时器点击服务器会在服务器上产生巨大的负载,即每秒最大连接数和不必要的客户端-服务器事务,即使没有并发登录

解决方案-除了我们目前的方法之外,还有其他方法来解决并发登录问题吗

非常感谢你的才华

有趣的问题

我想说的是,使用纯基于RAM的解决方案所能做的任何事情都可能最适合这种类型的问题。MySQL有一个基于RAM的存储引擎,但除此之外,MimCasHand和ReDIS都具有自动数据过期,并且可能具有优越的性能,因此我认为它们更适合。见和

如果你能确保你只击中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 |

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

我们在我的一项工作中处理这一问题的方法是创建一个“会话”表,以跟上当前登录的用户。此表加载了诸如“登录时间”、“ip/mac地址”、“用户名”、“浏览器”等信息。。。基本上,关于用户的“会话”信息。所以,当进行登录时,它会检查这个表,看这个用户是否已经登录,如果已经登录,并且满足了新登录的凭据,那么我们会从会话表中删除旧的行并添加新的。后端是一个cron作业,每分钟运行一次以检查重复条目,总是先删除最旧的条目。更好的方法是将会话数据存储在redis中,如果有人再次登录,则删除会话。这将自动从上一个会话注销用户