Php 阻止用户登录多台计算机

Php 阻止用户登录多台计算机,php,Php,我需要一种防止用户同时登录多台计算机的方法 目前,当用户登录时,我将userID存储在会话变量中。同时,我想删除具有相同用户ID的所有其他会话。可能吗 编辑: 我没有提到解决方案必须是基于文件的。PHP与web服务对话,不允许直接访问数据库 解决方案: 谢谢你的评论。以下是完成的代码: // When a new session is created file_put_contents(TEMPDIR."session_".$userid, session_id()); // For each

我需要一种防止用户同时登录多台计算机的方法

目前,当用户登录时,我将userID存储在会话变量中。同时,我想删除具有相同用户ID的所有其他会话。可能吗

编辑: 我没有提到解决方案必须是基于文件的。PHP与web服务对话,不允许直接访问数据库

解决方案: 谢谢你的评论。以下是完成的代码:

// When a new session is created
file_put_contents(TEMPDIR."session_".$userid, session_id());

// For each request
if (file_exists(TEMPDIR."session_".$userid) == true) {
    $session_id = file_get_contents(TEMPDIR."session_".$userid);
    if ($session_id != session_id())) { 
        session_destroy();
    }
}

每次用户登录时,您都可以将
session\u id()
写入名为
$user\u id.session
的文件。然后,每次在脚本顶部调用
session\u start()
时,加载文件的内容,如果
$user\u id.session
中包含的id不等于
session\u id()
则调用
session\u destroy()
来销毁旧会话

或者,您可以(也应该)将相同的信息写入键值存储(KVS),如Redis或Memcached,或者,如果确实必须写入数据库


为清楚起见,我从评论中添加了以下信息:

也就是说,每次登录(在新计算机上)时,您都会向文件中写入一个新的
会话id()
,因此旧会话将过期(如果和当它们尝试重新加载站点时),因为它们不再匹配文件中的
会话id()


每次用户登录时,您都可以将
session\u id()
写入名为
$user\u id.session
的文件。然后,每次在脚本顶部调用
session\u start()
时,加载文件的内容,如果
$user\u id.session
中包含的id不等于
session\u id()
则调用
session\u destroy()
来销毁旧会话

或者,您可以(也应该)将相同的信息写入键值存储(KVS),如Redis或Memcached,或者,如果确实必须写入数据库


为清楚起见,我从评论中添加了以下信息:

也就是说,每次登录(在新计算机上)时,您都会向文件中写入一个新的
会话id()
,因此旧会话将过期(如果和当它们尝试重新加载站点时),因为它们不再匹配文件中的
会话id()


我以前这样做的方法是保存用户上次登录数据库时的会话id。 然后,在身份验证检查中,我查看当前会话ID与数据库中的会话ID是否匹配,如果不匹配,则将其注销(即取消设置成员会话)


但在国际海事组织,这并不是解决这个问题的最佳办法。我认为更好的方法是不允许第二个人登录(这样你就不会打扰第一个人的体验)。当您有两个真正的用户登录并不断地将另一个人注销时,这也会停止问题的出现。

我以前这样做的方法是将用户上次登录时的会话id保存在数据库中。 然后,在身份验证检查中,我查看当前会话ID与数据库中的会话ID是否匹配,如果不匹配,则将其注销(即取消设置成员会话)



但在国际海事组织,这并不是解决这个问题的最佳办法。我认为更好的方法是不允许第二个人登录(这样你就不会打扰第一个人的体验)。当您有两个真正的用户登录并不断注销另一个用户时,这也会停止问题的出现。

您是否注意到此页面的“相关”部分,其中包含指向同一问题的链接,以前曾被问过十几次?是的,但我没有在相关问题中找到解决方案。您是否注意到此页面的“相关”部分,同一个问题的链接以前被问过十几次?是的,但我在相关问题中没有找到解决方案。这不起作用,因为每台计算机都有不同的会话id。这会很好,如果你将其写入数据库而不是文本文件,效果会更好,因为每次加载一个page@PiTheNumber事实上——这是一个想法——只有最后创建的会话不会被破坏为什么要使用文本文件?使用数据库。a)文本文件比数据库更普遍-Tom没有提到他正在使用数据库,所以我不想假设,b)如果我这样做,我会将其放入一个键值存储,如Redis,c)当每个HTTP请求都需要一个或两个额外的查询时,数据库的扩展性不好,但是文本文件被操作系统很好地缓存,d)还有很多原因。但是,如果您继续进行多前端设置,则需要切换到KVS或DB,或者找到一种同步文件的方法,但这种方法不起作用,因为您为每台计算机获得不同的会话id。这将很好地工作,如果您将其写入数据库而不是文本文件,效果会更好,因为每次加载一个page@PiTheNumber事实上——这是一个想法——只有最后创建的会话不会被破坏为什么要使用文本文件?使用数据库。a)文本文件比数据库更普遍-Tom没有提到他正在使用数据库,所以我不想假设,b)如果我这样做,我会将其放入一个键值存储,如Redis,c)当每个HTTP请求都需要一个或两个额外的查询时,数据库的扩展性不好,但是文本文件被操作系统很好地缓存,d)还有很多原因。但是,如果您继续使用多前端设置,您需要切换到KVS或DB,或者找到一种更好的同步文件的方法?如果第一个人的电脑重新启动了怎么办?你还必须在电脑上设置某种超时,这样如果真的发生了这种情况,那么这个人在设定的时间段后仍然可以登录。曾经代替过这样的人,无法登录吗?不能说我有,但我仍然认为这是一种更好的方式