我使用以下脚本登录
session_start();
$_SESSION['username'] = $query[0]['username'];
$_SESSION['email'] = $_POST['email'];
$_SESSION['image'] = $query[0]['image'];
$_SESSION['role'] = $query[0]['role'];
$_SESSION['banned'] = $query[0]['banned'];
$_SESSION['id'] = $query[0]['id'];
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['useragent'] = $_SERVER['HTTP_USER_AGENT'];
setcookie(session_name(),session_id(),time()+604800,"/");
//redirect to homepage since now logged in.
现在我再次登录主页并登录,一切正常。 但是在几个小时后,isset($ _ SESSION ['用户名'])将返回false,但到期时间仍设置为7天,并且cookie仍然存在。
有效期的小时比我的时区的实际时间小1小时。不确定这是否重要。我将时区服务器端更改为随机时区,并且cookie过期数据没有更改。
htaccess的:
php_value session.cookie_lifetime 604800
php_value session.gc_maxlifetime 604800
(这个htaccess在root中,上面的第一个代码块是root / login。不确定是否重要。)
答案 0 :(得分:0)
将session_start();
和session_regenerate_id();
移到脚本底部。
<?php
$_SESSION['username'] = $query[0]['username'];
$_SESSION['email'] = $_POST['email'];
$_SESSION['image'] = $query[0]['image'];
$_SESSION['role'] = $query[0]['role'];
$_SESSION['banned'] = $query[0]['banned'];
$_SESSION['id'] = $query[0]['id'];
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['useragent'] = $_SERVER['HTTP_USER_AGENT'];
setcookie(session_name(),session_id(),time()+604800,"/");
session_start();
session_regenerate_id();
?>
这种逻辑背后的原因是您正在设置cookie,一旦设置好并准备就绪,那么您就开始了会话。有一个答案here可以更好地解释它:
Cookie数据在页面标题中发送。
将标头发送到客户端后,您无法设置Cookie。
一旦您开始向客户端输出任何数据(即:浏览器),就会发送标题。
答案 1 :(得分:0)
尝试使用内置session_set_cookie_params可能是最糟糕的,而不是通过黑客来更改Cookie的到期日期...另请注意session_regenerate_id
可能导致{{3} }}