【发布时间】: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() 之前设置会话参数,是否保证会话将在指定时间段后被销毁并重置?