是否可以从其他会话访问$_SESSION变量


Is it possible to access $_SESSION variables from other sessions?

我的网站使用会话进行用户登录,我希望在每个页面上都有一条消息,显示用户有多少台计算机登录到他们的帐户(就像Gmail一样)。

例如,如果他们在两台不同的计算机上登录,我希望消息是:

You are logged in on 2 computers.

我知道如何检查他们是否登录了——我只检查$_SESSION['username']变量,如果设置了它,那么他们就登录到了那台计算机上。但是,我如何检查在其他会话中是否设置了相同的username(表示它们已登录到其他计算机上)?

使用默认的基于文件的PHP会话很难做到这一点。默认情况下,PHP只是将会话信息存储在文件系统中文件的不透明blob中,文件名为会话id。如果不逐个打开并评估这些文件,就无法直接访问这些文件中的数据。

您需要的是将这些信息移动到数据库中。要么只在数据库中存储并发登录的数量,并保持其他会话的原样,但这很难保持同步。最好切换到会话的完整数据库后端,而不是基于文件的存储。这允许您透明地查询会话中的任何数据,包括轻松获取有关用户有多少会话的统计信息。

您将希望将会话数据存储在数据库中。然后,如果有多个用户具有相同的ID,则可以查询数据库。

注意:我不会转义示例中的数据,但您需要使用mysqli或PDO

创建一个表logged_in_users或类似的东西,其中包含一些列,如下所示:

create table logged_in_users(
    user_id int unsigned,
    login_date datetime,
    hash_key char(32),
    unique key user_hash_key(user_id, hash_key)
);

当用户登录时,删除旧记录,然后添加新成员,如下所示:

$hash_key = md5(time().uniqid().rand(0,1000)); // Create a unique key
$_SESSION["hashkey"] = $hash_key;
// Remove the inactive members (this uses 10 minutes)
delete from logged_in_users where login_date > date_sub(now(), interval 10 minute);
// Add the user 
insert ignore into logged_in_users (user_id, login_date, hash_key) values (123, now(), '$hash_key');

当用户加载页面时,你应该检查用户是否还有记录,如果他/她不喜欢,就插入一条:

$hash_key = $_SESSION["hashkey"];
insert ignore into logged_in_users (user_id, login_date, hash_key) values (123, now(), '$hash_key');

然后,当你想知道有多少人登录时,你可以这样做:

// Total people for a particular member
select count(*) as total from logged_in_users where user_id = 123;
// Total people logged in
select count(*) as total from logged_in_users;
// Total members logged in (not people)
select count(distinct user_id) as total from logged_in_users;

最后,当用户注销时,像这样删除它们:

$hash_key = $_SESSION["hashkey"];
delete from logged_in_users where user_id = 123 and hash_key = '$hash_key';

只需在users表上为登录计数创建一个额外的列。当登录到服务器的用户将列增加1计数时,当注销的用户将减少1计数时。。。

顺便说一下,会话是为每个浏览器创建的。。您不能从会话访问其他会话变量