【发布时间】:2014-10-14 12:04:58
【问题描述】:
我只需要以这种方式限制一次登录,这样用户就不能一次使用一个帐户多次登录。用户也可以登录到不同的服务器,所以我不能使用 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...
知道可能出了什么问题吗?
【问题讨论】:
-
你的登录和会话/内存缓存存储过程有点不清楚atm。还有更多的代码 sn-ps/解释吗?
-
@ToBe Login 是简单地将会话变量存储为 true。 Memcache 会话存储在 php.ini 中通过更改
session.save_handler和session.save_path进行更改。另外我发现这个 当页面完成时,它会将会话中的数据推送到 memcached。最后一步很关键,因为它控制着 memcached 中数据的过期时间。 发现 here -
您是否验证了使用 memcache 的会话确实有效?如果有疑问,请创建一个非常小的 PHP 文件以排除代码中的任何错误,并尝试使用一个会话变量。
-
会话确实有效,我通过 ssh 连接到 memcache 服务器,查询了特定的会话 ID,我确实看到了结果。正如我所说,即使这个删除部分也有效,但它是在页面末尾执行的,并且在删除语句之后每次写入会话都不会存储在内存缓存中。嗯,实际上现在我想到了,在删除语句之后将某些内容存储到会话中(编码数据,因此无法真正看到),但用户未设置为已登录...我将在外部文件中进行测试。 Tnx。
-
不,如果你的会话处理程序存储了它的信息并且它也从内存缓存中检索它,那么会话就可以工作。您永远不必自己操作该内存缓存,因为它实际上可能导致会话损坏。尝试通过正常的会话机制删除会话内的变量。不要直接访问 memcache。