【问题标题】:PHP - Session Cookies are expiring/invalidating earlier then expectedPHP - 会话 Cookie 比预期更早过期/失效
【发布时间】:2017-09-01 17:45:46
【问题描述】:

我使用以下脚本登录

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['username']) 会返回 false,但过期时间仍然设置为 7 天,并且 cookie 仍然存在。

到期日的时间比我所在时区的实际时间晚 1 小时。不确定这是否重要。我将时区服务器端更改为随机时区,cookie 过期数据没有改变。

.htaccess:

php_value session.cookie_lifetime 604800
php_value session.gc_maxlifetime 604800

(此 htaccess 位于 root 中,上面的第一个代码块位于 root/login 中。不确定是否重要)。

【问题讨论】:

  • 你的电脑时间是格林威治标准时间 18:52
  • @craig 正确。
  • 设置时区再试一次 - date_default_timezone_set('Your time zone');
  • @craig 设置时区有什么好处?真的没必要。
  • 我仍然遇到这个问题 - 再有帮助会很棒

标签: php .htaccess session cookies


【解决方案1】:

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 可以更好地解释它:

  1. Cookie 数据在页面头部发送。

  2. 将标头发送到客户端后,您无法设置 cookie。

  3. 只要您开始向客户端(即:浏览器)输出任何数据,就会发送标头。

【讨论】:

  • 你能解释一下这到底是做什么的吗?至于有什么区别?
  • 好的,我通常运行 session_start();在我需要抓取前、用户名或图像的所有页面上。我不应该这样做吗?如果我把它排除在外,它实际上根本不会出现。也不重新生成id,基本上删除旧的并获取新的会话cookie等?
  • 无论您在哪里使用用户数据,都需要session_start();您只需在发送标头之前创建 cookie 的值。如果您没有设置新的 cookie,请使用 session_start
  • 您需要存储在会话中的 cookie 或标头的任何信息都必须在发送出去之前创建
  • 好吧 - 好吧,这里似乎不需要 session_regenerate_id,不确定我为什么要使用它。在我设置会话变量之后放置 session_start 是没有意义的,因为 session_start 无法识别它们并且不会设置它们。我什至尝试过,它所做的只是制作没有可变数据的 cookie。
【解决方案2】:

尝试使用内置的session_set_cookie_params 可能是最糟糕的,而不是修改 cookie 的到期日期...还要注意session_regenerate_id 可能导致sessions being lost

【讨论】:

  • 是的,看来我不需要 session_regenerate_id,我已将其删除,一切正常。不知道为什么我有它,也不知道这是否解决了它。
猜你喜欢
  • 2013-12-26
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多