【问题标题】:php session not being deleted after setting its lifetime设置生命周期后未删除php会话
【发布时间】:2017-08-17 07:19:14
【问题描述】:

我是 php 新手,正在练习 php 会话。基本上,我有一个登录表单,仅当会话不存在时才会显示给用户,否则页面显示“用户已经登录”。 我已使用以下方法设置会话生命周期和 cookie 时间:

    session_set_cookie_params(60);
    ini_set('session.gc_maxlifetime', 60);

我希望在1 minute 之后销毁会话,以便用户必须重新登录。但是在我的实现中,会话仍然存在很长时间并且用户已经登录。

在我的login.php 我有:
1:如果使用 POST req 访问 login.php,则检查登录凭据
2:如果设置了 SESSION['logged_in'] 则不显示表单,回显“已登录”

<?php

require_once("helpers.php");

session_start();
if(!empty($_POST)){
    loginUser($_POST['user_id'], $_POST['pass']);
}

<?php
if(!isset($_SESSION['logged_in'])){
    echo "<br>SESSION IS NOT SET UP";
    ?>

    <HTML>
    <HEAD>
        <LINK rel="stylesheet" type="text/css" href="style.css">
        <SCRIPT src="test.js"></SCRIPT>
    </HEAD>
        <BODY>
            <H1>Please login</H1>
            <FORM action="login.php" method="post">
                <span class=formlabel>Username:</span>
                <INPUT  name="user_id" type="text" class="forminput" require><BR>
                <span class=formlabel>Password:</span>
                <INPUT  name="pass" type="password" class="forminput" require><BR>
                <INPUT type="submit" value="Login" style="width:80px;margin-left:100px;margin-top:3px;"><BR><BR>
                Don't have an account? <A href="register.php">Click here to register</A>.
            </FORM>
        </BODY>
    </HTML>
<?php
}else{
    echo '<strong>user already logged in.<br></strong>';
}
?>

然后在我的helper.php 我有一个功能: 1:检查数据库中的用户名和密码
2:如果存在则设置会话。

function loginCheck($user_id, $pass){
   //here goes code which checks if user_id & pass exists
   //store in $RESULT if exists
    if(!empty($result)){

        session_set_cookie_params(30, '/');
        ini_set('session.gc_maxlifetime', 30);
        $_SESSION['username'] = $user_id;
        $_SESSION['logged_in'] = true;
    }
}

现在,当我以用户身份登录时,会话开始并且登录表单消失,这是我想要的正确行为。但是会话永远不会结束,我的意思是即使我在 10 分钟后刷新页面,表单也不会显示并显示“用户已经登录”。

还有:
1:会话在 maxLifetime 之后会自行销毁吗?
2:如果不是我们必须销毁它吗?

谢谢

【问题讨论】:

  • 您需要在开始会话之前设置会话参数
  • @jeroen 如果我在 sessiont_start() 之前设置会话参数,是否保证会话将在指定时间段后被销毁并重置?

标签: php session cookies


【解决方案1】:

gc_maxlifetime 值是数据将被视为垃圾并可能清理的秒数。您需要确保此值设置得足够高,以免您的会话过早销毁,但您不能依赖会话在这段时间之后被销毁。

如果您希望会话在特定时间段后销毁,那么您应该存储一个时间戳,然后使用该时间戳和会话的存在来查看会话是否仍然存在。像这样的:

$_SESSION['last_access'] = time();

稍后,检查它是否仍然处于活动状态:

if ( isset( $_SESSION['last_access'] ) && $_SESSION['last_access'] - 60 > time() ) {
    // The session is still alive
} else {
    // The session should be destroyed
    session_destroy();
    unset( $_SESSION );
}

然后,您将来检查是否存在任何 $_SESSION 值将按您预期的方式工作。

【讨论】:

  • 谢谢。另外,我在我的 login.php 中使用了 session_start() 是否也需要在我的 helpers.php 中这样做?刷新页面是否会重置 cookie 和会话生命周期?
  • 我会将创建last_access 索引的代码放入您的helpers.php 文件中。其他代码将转到您想要验证会话的任何位置。每次调用 session_start() 时都会重置会话生存期计数。如果您希望会话在上次访问页面后持续 60 秒(以便重新加载页面会刷新会话),那么这是所需的行为。否则,您需要在分配之前检查last_access 索引是否存在,以免每次加载时都重置它。
猜你喜欢
  • 1970-01-01
  • 2012-04-07
  • 2012-03-28
  • 2015-07-09
  • 2017-11-08
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2012-08-06
相关资源
最近更新 更多