保持单一登录的用户到一个帐户在PHP

问题描述:

我想要使用PHPMySQL的一个登录系统,并做以这样的方式,每一次只有一个人在任何时候登录到我的系统的时间。如果同一用户在另一个窗口/会话/地点登录,则旧的运行实例应该失效并且应该验证新的运行实例。保持单一登录的用户到一个帐户在PHP

我知道我可以通过将会话ID存储在数据库中以及一些例程来检查它并持续不断地对数据库操作进行定期验证。

是否有任何其他方式可以完成此操作,以便将验证检查最小化,并且我无需在每个页面上刷新查询以检查用户是否处于上次记录的有效登录会话中。

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

+0

只是为了澄清 - 你想在任何时候只有一个单一的会议,或只有一个会议*每个用户*? – 2011-02-12 19:50:15

+0

我认为你必须将它们存储在数据库中,然后在每个页面中检查。必须在每个页面上调用session_start()。至于“定期”验证,您可以使用AJAX每隔一段时间验证一次。 – 2011-02-12 19:51:55

您不需要任何轮询方法,事实上,您只需将任何登录用户的会话标识及其用户名存储在数据库中即可。

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

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

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

每当用户加载主页的网站时,您都必须检查用户是否已登录。这总是一个sql查询。因此,将会话密钥与用户数据一起存储,并且只需将会话密钥添加到WHERE子句以标识用户即可。通过这种方式,您只有一个sql查询,您无论如何都可以确定用户已经登录。

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

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

如果您在多台服务器上运行,那么memcache可能值得寻找类似的实现。