【问题标题】:Session initialize after manually timeout in php在php中手动超时后会话初始化
【发布时间】:2012-08-15 06:46:35
【问题描述】:

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

问题在于第一次登录尝试或会话销毁(超时)后 $_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>

【问题讨论】:

  • 不完全确定您的问题/问题在这里-也许只是措辞模棱两可,但是您的第二句话似乎可以归结为“当我第一次创建会话时,它是空的”;为什么不呢?
  • 当我第一次提交表单时,我希望$_SESSION['loginToken'] 作为输出,但$_SESSION 是空的。那是我的问题...
  • 为什么不删除 if 子句,只保留session_start

标签: php session


【解决方案1】:

我不确定(现在无法测试),但是

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

似乎永远不会发生,因为 $_SESSION 总是被设置。尝试不使用 if:

session_start();

不要这样做

$_SESSION = array();

因为这是不好的做法。

【讨论】:

  • 是的,如果部分已删除,并且现在可以正常工作。添加了$_SESSION = array();,因为在session_destroy(); 之后,$_SESSION 中的值仍然可用,我不希望这样
  • $_SESSION = array(); 实际上用在了php.net/session_destroy的PHP文档示例中
  • 不,这不会清除 $_SESSION(即使第二个参数设置为 true),所以不会替换那部分代码。
【解决方案2】:

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

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

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

【讨论】:

  • 所以我在session_destroy();下面添加了session_start();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2015-11-18
相关资源
最近更新 更多