如何正确管理PHP会话cookie过期?

ali*_*lik 5 php cookies session session-cookies

PHP 网站使用 cookie 在浏览器端存储会话 ID。目标是在最近的用户与站点交互后的特定时间段内,PHP 会话将被视为有效。

PHP 会话有两个不同的超时:

  • cookie 过期 - 当浏览器忘记包含会话 ID 的 cookie 时
  • 会话过期 - 当服务器忘记会话数据时

PHP 内置逻辑仅在第一次session_start()调用时发送 cookie ,即生成会话 ID。cookie 不会在进一步请求时发送,因此 cookie 过期时间永远不会延长。

与此相反,每次请求都会延长 PHP 会话到期时间。

因此,如果用户持续与站点交互,PHP 会话过期时间会延长,但 cookie 过期时间保持其原始值。

例子:

  • PHP 会话和 cookie 寿命设置为 5 个时间点
  • 用户在时间点 1、2 和 4 与站点交互

时间点/PHP 会话过期/cookie 过期

1 / 6 / 6

2 / 7 / 6

4 / 9 / 6

  • 如果确定在时间点 7 与站点交互,则 cookie 已经过期,因此不会将其发送到服务器。因此,即使 PHP 会话在技术上有效,请求也会像 PHP 会话已过期一样。

如何强制 PHP 在每个(或几乎每个)请求上更新 cookie 的过期时间?最佳做法是什么?

我在网上没有找到任何有用的东西,也没有找到任何可行的解决方法。例如,我发现以下建议:

  • 最初将 cookie 设置为更长的寿命 - 这只是推迟了 cookie 的神奇消失,并且不会主要对总体目标做出贡献(考虑在最近的用户交互之后会话有效)。
  • 在触发发送新 cookie 的每个请求上重新生成会话 ID - 这感觉有点激进,可能会导致并发副作用(并发请求可能不会来自浏览器序列化而是并行)
  • 手动管理 cookie - 这需要模仿 PHP 的逻辑(并保持自定义实现与内置逻辑兼容),以确保在每个请求上都发送回一个具有延长到期时间的新 cookie

注意:本题中的 session 是指 PHP 管理的 session,而不是浏览器。cookie 过期应该独立于浏览器会话。因此,该建议Is possible to keep session even after the browser is closed?根本不相关。

编辑:该问题已被归类为PHP 错误