php - 如何正确管理 PHP 会话 cookie 过期?
问题描述
PHP 网站使用 cookie 在浏览器端存储会话 ID。目标是 PHP 会话将在最近的用户与站点交互后的特定时间内被视为有效。
PHP 会话有两个不同的超时:
- cookie 过期 - 当浏览器忘记包含会话 id 的 cookie 时
- 会话过期 - 当服务器忘记会话数据时
PHP 内置逻辑仅在第一次session_start()
调用 cookie 时发送 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
注意:这个问题中的会话是指由 PHP 管理的会话,而不是浏览器。cookie 过期时间应该独立于浏览器会话。因此,该建议Is possible to keep session even after the browser is closed?
根本不相关。
编辑:该问题已被归类为PHP 错误。
解决方案
推荐阅读
- database - 在两个环境之间复制表 - Redshift
- powershell - 如何检查文件中的列数以满足条件
- amazon-web-services - 如何在 Amazon Go 库中使用 https 代理?
- php - 将摘录长度限制在
- string - Angular 5在另一个变量更改时自动更新字符串变量
- docker - 执行yii migrate时如何修复错误异常?
- lua - Lua:返回表槽函数为零
- haskell - Hask 是否形成理论上有效的类别?或者它只是假装是一个?
- c# - ASP.NET Core 2.0 Identity - 密码错误消息未显示在视图中
- java - Java groupingBy List