2

我想使用PHPMySQL制作一个登录系统,并以每次只有一个人在任何时间点登录到我的系统的方式进行操作。如果同一用户在另一个窗口/会话/位置登录,则应使旧运行实例无效,并应验证新实例。

我知道我可以通过将会话 ID 存储在数据库中以及一些检查它并不断定期或在任何数据库操作上验证它的例程来完成此操作。

有没有其他方法可以做到这一点,以便最大限度地减少验证检查,并且我不必在每次页面刷新时触发查询来检查用户是否处于上次记录的有效登录会话中。

简而言之,我可以总结一下我需要一种技术,以便只有我最后一个有效的登录浏览器窗口才被 webapp 提供。

4

3 回答 3

2

您不需要任何轮询方法,实际上您需要做的就是将任何登录用户的会话 ID 及其用户名存储在数据库中。

然后,在每次登录时,只需检查登录的用户是否已经存储了会话。如果他们这样做,则使该会话无效并将新登录的会话存储在数据库中。

当旧会话尝试重新连接到应用程序时,他们的会话数据将不再存储在您的服务器上,因此他们将不再登录。

所有这一切都需要在有人登录时进行额外检查,而不是任何轮询方法等。

于 2011-02-12T19:54:45.847 回答
0

每次用户加载您主页的站点时,您都​​必须检查用户是否已登录。这始终是一个 sql 查询。因此,将会话密钥与用户数据一起存储,然后您可以简单地将会话密钥添加到 WHERE 子句以识别用户。通过这种方式,您只有一个 sql 查询,无论如何您都可以验证用户是否已登录。

于 2011-02-12T19:55:02.307 回答
0

首先,我将使用数据库构建它来管理您的会话策略。如果它被证明是瓶颈,那么您可以优化。

如果应用程序在单个服务器上运行,您也许可以使用共享内存(例如使用 APC 的apc_storeapc_fetch)来存储一些可以在进程之间共享的状态信息。这可以简单地存储最后一个已知的会话 ID,键入用户 ID。然后您可以快速发现当前会话是否仍然有效。

如果您在多台服务器上运行,那么 memcache 可能值得一看以实现类似的目标。

于 2011-02-12T19:57:15.177 回答