2017-08-17 72 views
0

我是一名php新手,正在练习php会话。基本上,我有一个登录表单,只有当会话不存在时才会显示给用户,否则页面显示“用户已登录”。 我已经设置了会话寿命以及使用的cookie时间:php会话在设置其生存期后没有被删除

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:检查数据的用户ID和密码基地
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:如果没有,我们必须销毁它?

谢谢

+0

您需要在启动会话之前设置会话参数*。 – jeroen

+0

@ jeroen如果我在sessiont_start()之前设置了会话参数,那么会话会在指定的时间段后被销毁和重置吗? –

回答

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值的存在检查将工作,你所期望的方式。

+0

谢谢。另外,我在我的login.php中使用了session_start(),我是否也需要在helpers.php中做到这一点?并刷新页面重置cookie和会话生存期? –

+0

我会在'helpers.php'文件中放置创建'last_access'索引的代码。其他代码将在您想验证会话的任何地方执行。每次调用'session_start()'时,会话生存期计数都会重置。如果您希望自上次访问页面后会话持续60秒(以便重新加载页面可刷新会话),那么这就是所需的行为。否则,在分配它之前,你需要检查是否存在'last_access'索引,以便它不会在每次加载时都被重置。 –