php中手动超时后会话初始化


Session initialize after manually timeout in php

所以我有一个登录系统,它为每次登录尝试生成一个随机令牌,并将其保存在$_session['loginToken']中,并在发布表单后检查会话值是否等于发布的输入。我还在这里发现了手动设置一定时间后的超时:如何在30分钟后使PHP会话过期?

第一次登录尝试或会话销毁(超时)后出现问题$_session是一个空数组,没有设置任何内容,但第二次尝试后工作正常。

<?php
if(!isset($_SESSION))
    session_start();
print_r($_SESSION);
/*
first try output : Array ( )
second try output : Array ( [LAST_ACTIVITY] => 1345402023 [loginToken] => e3d997090751883feadfed3ae4d8b63e )
*/
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 10)) {
    session_destroy();
    $_SESSION = array();
}
$_SESSION['LAST_ACTIVITY'] = time();
$token = $_SESSION['loginToken'] = md5(uniqid(mt_rand(), true));
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<form method="post" action="<?=$_SERVER['PHP_SELF'];?>">
    <input type="hidden" name="token" value="<?=$token;?>" />
    <button type="submit" value="login" id="login" name="login">Click</button>
</form>
<body>
</body>
</html>

我不确定(现在不能测试),但

if(!isset($_SESSION))
    session_start();

似乎从未发生过,因为$_SESSION始终处于设置状态。尝试不使用if:

session_start();

不要做

$_SESSION = array();

因为这是不好的做法。

关键提示在session_destroy():的文档中

要再次使用会话变量,必须调用session_start()。

销毁会话也会关闭它,因此在分配任何变量之前,您首先需要重新打开一个新会话。