从远程服务器删除memcache会话

时间:2014-10-14 12:04:59

标签: php session memcached

我只需要以这种方式限制一次登录,这样用户就无法一次多次使用一个帐户登录。用户也可以登录不同的服务器,所以我不能使用session_destroy,我需要“手动”删除会话。

当使用会话与文件存储它工作正常,我删除文件,登录新用户一切都很好。但是当我使用带memcache的会话时,我可以从memcache中删除会话,但是在同一请求中进一步登录会丢失。

我就是这样做的:

session_regenerate_id();
$session_id = session_id(); 

$m = new Memcache();
$m->connect('XXX.XXX.XXX.XXX', 11211);

$ans = $m->delete(SESSION_ID_OF_ALREADY_LOGGED_USER);

$query = "UPDATE activeLogins SET activeSession = '{$session_id}' WHERE userEmail = $safeEmail LIMIT 1";
$dbh->exec($query);

//Login new user...

知道可能出现什么问题吗?

1 个答案:

答案 0 :(得分:2)

根据数据库中存储的内容

检查会话ID

据我了解,您希望将一个用户限制为一台客户端计算机。该机器应该是最后登录的机器。我认为你应该能够通过简单检查每个页面加载来实现这一点。

根据您的问题,我可以看到您的数据库有一个名为activeLogins的表,其中包含以下字段:activeSessionuserEmail

由此我假设它是唯一标识用户的电子邮件地址。因此,在新登录后,您会在$session_id表中找到$safeEmailactiveLogins和相应的更新行。

现在假设用户没有注销旧机器?下一页加载会发生什么(在更新activeLogins表之前)?是的,activeSession将与该服务器上的$session_id不同。请记住,新登录名已更改。

所以您需要做的就是检查$session_id是否与activeSession表中的activeLogins匹配。

我还建议仅在新登录后更新activeLogins表,而不是每次加载页面时。虽然你的问题不清楚你是否这样做。

我不确定这是否真的能回答你的问题。这似乎是一个简单的答案。不过你的问题不是很清楚。您是否真的在每次加载页面时使用按顺序显示的代码?!

为了回答您的所有答案,我一直在寻找将通知从服务器推送到客户端计算机的最佳方式。你自己提到的一种方法是ajax民意调查,但我认为这是一种不好的做法,不应该使用。

有棘轮(http://socketo.me)它会给你一个连续的连接。您可以在检测到其他登录时删除连接,并对旧客户端中的连接作出反应。

还有一个更高级别的接口,用于将事件从服务器发送到客户端:

https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events

但是在IE中不支持,因此它通常不可用。

您还可以查看http://pusher.com

所有这些建议的要点是,您可以有效地向客户推送信号,表明它应该删除对您所服务的网站的访问权限,而不会不断进行轮询。