可能重复:
如何在 30 分钟后使 PHP 会话过期?
如何检测会话 ID 是死的还是活的?让我们假设有人登录 - 创建了一个新会话,我保存了会话 ID。如果他从另一个浏览器登录,我可以确定他登录了两次。但是如何检测他是否退出?
可能重复:
如何在 30 分钟后使 PHP 会话过期?
如何检测会话 ID 是死的还是活的?让我们假设有人登录 - 创建了一个新会话,我保存了会话 ID。如果他从另一个浏览器登录,我可以确定他登录了两次。但是如何检测他是否退出?
您需要做的是,当他在新浏览器上登录他的帐户时,找到与他的帐户关联的旧 sessionID 并将其过期。当他单击注销按钮时,您可以退出该 sessionID。
编辑:
对不起,我读错了你的问题。您要做的是设置会话超时,因此如果达到超时,您将假定会话已死并使其过期。在每个页面请求上,您都将更新过期时间以使其生效。如果他们从另一个浏览器登录,您可以假设旧浏览器中的会话是旧的,并立即将其过期或让它随着超时而过期。
然后,您可以在页面加载时检查会话超时,或运行将在会话数据库中运行并使所有旧会话过期的 cron 脚本。
当用户登录时,您应该设置一个会话变量来表示他们已登录。
如果用户注销,您应该使用session_destroy()
来结束会话。
这样变量就被破坏了,所以如果你检查会话变量,它就不会是真的。我个人使用$_SESSION['isLoggedIn'] = TRUE
.
编辑添加:如果您希望它在多个浏览器或计算机上工作,您需要将登录或会话 ID 保存到数据库,以便您可以检查用户是否在其他地方登录。
一般来说,“登录”的动作通常与某种持久层相关联,通常是数据库服务器中用户的表/集合。
在登录时使用此保存的数据创建会话,并以某种方式将保存的数据序列化到$_SESSION
超全局中。
如果您想全局跟踪登录/注销,则需要保存与两个单调递增整数相关联的用户 ID(通常是电子邮件或登录凭据),这些整数表示他们从任何地方登录/注销的次数。
没有硬性规定必须在数据库中进行,只是可以更好地扩展。对于小型或测试用例,您可以轻松保存分页文件。
主要思想是,要让任何类型的数据持续超过session_id
引用服务器上会话的 cookie 的过期时间,您需要实现某种形式的持久性。
当用户登录并将变量设置为 true 时使用 $_SESSION[]。如果需要,您也可以在会话变量中保存一些数据。一旦用户单击注销,将会话变量设置为 false。代码如下:
function Login()
{
if(!isset($_SESSION)){ session_start(); }
if(!$this->CheckLoginInDB($email,$password))
{
return false;
}
$_SESSION[$this->GetLoginSessionVar()] = $email;
return true;
}
function GetLoginSessionVar()
{
$retvar = md5($this->rand_key);
$retvar = 'usr_'.substr($retvar,0,10);
return $retvar;
}
function LogOut()
{
session_start();
$sessionvar = $this->GetLoginSessionVar();
$_SESSION[$sessionvar]=NULL;
unset($_SESSION[$sessionvar]);
}
这是一种简单的方法。如果你想休息一下。您可以为 $_SESSION[] 变量使用开始时间,然后设置超时时间。检查在那之前的任何活动,然后像这样退出:
function LogOut(){
session_start();
// set timeout period. This will be in seconds.
$inactive = 1000;
// check to see if $_SESSION['timeout'] is set
if(isset($_SESSION['timeout']) ) {
$session_life = time() - $_SESSION['start'];
if($session_life > $inactive)
{ session_destroy(); header("Location: logoutpage.php"); }
}
$_SESSION['timeout'] = time();
}
There could be more better ways of doing this. I am looking for a better way to do it myself . Hope it helps.
So if he closes his browser he will be logged out after inactivity anyway. But if you want logout after browser is closed check ini.session.cookie-lifetime
为此,您将需要登录您的用户表,或切换到将会话存储在数据库中,然后您可以针对用户检查会话(如果您以这种方式进行设置)。