答案 0 :(得分:0)
我是如何处理项目中的问题的:
我登录后抓取了用户的会话ID并将其存储在数据库中。
每当用户登录时,您都会获取存储在数据库中的会话ID并销毁它。
这将确保无论何时从其他浏览器或计算机登录,他们的上一个会话都将被销毁。
以下是登录页面上的一些示例代码:
session_commit();
session_id(session_create_id());
session_start();
//followed by other code
使用session_create_id函数将创建一个唯一的会话ID,因为它会检查它所创建的会话ID是否存在。
下一步:
$query = "UPDATE user_table SET sess_id = ? WHERE id = ? AND sess_id = '0'";
$query_run = $database->prepare($query);
if($query_run->execute([session_id(), $user_id])):
if($query_run->rowCount() < 1){
$query = "SELECT sess_id FROM user_table WHERE id = ?";
$query_run = $database->prepare($query);
if($query_run->execute([$user_id])){
//custom session destroy function
session_destroy_client($query_run->fetchAll()[0]['sess_id']);
$query = "UPDATE user_table SET sess_id = ? WHERE id = ?";
$query_run = $database->prepare($query);
$query_run->execute([session_id(), $user_id]);
}
}
endif;
让sess_id的默认值为零。每当用户注销时将其设置为零。但无论何时登录,您仍需要检查他们是否在数据库中存储了会话ID,然后销毁该会话。这就是自定义销毁会话的样子:
function session_destroy_client(string $id){
// 1. commit session if it's started.
if (session_status() != \PHP_SESSION_ACTIVE) {
session_write_close();
}
ini_set('session.use_strict_mode', 0);
// 2. store current session id
session_start();
$cid = session_id();
session_write_close();
// 3. hijack then destroy session specified.
session_id($id);
session_start();
session_destroy();
session_write_close();
// 4. restore current session id. If you don't restore it, your current session will refer to the session you just destroyed!
session_id($cid);
session_start();
}
那应该有用。如果您愿意,可以将自定义函数添加到类中,并添加适合您需要的功能。