如何在浏览器关闭后保存 PHP 会话? (没有单独的 cookie)

How to save PHP session after browse closing? (without separate cookies)

有很多 Stack Overflow 问题建议使用单独的 cookie 来保存会话参数,但我不想在客户端存储任何额外的 cookie。

目前,每次浏览器重新启动后,我都有一个会话参数为空的新会话。

有什么方法可以在每次浏览器重新启动后保持 PHP 会话处于活动状态?

站点非常简单,没有数据库。我将所有数据存储在 $_SESSION 中。

我猜,您使用 session_start 函数开始新会话。如果我是正确的,那么 PHPSESSID cookie 的默认生命周期等于 0。零生命周期意味着 cookie 是会话 cookie。

会话 cookie 在当前会话结束时被删除。浏览器定义“当前会话”何时结束,几乎所有浏览器都在浏览器关闭时结束会话。

您可以尝试使用 session_set_cookie_params 函数设置会话 cookie 的生命周期。第一个输入参数是 $lifetime 定义会话 cookie 的生命周期,以秒为单位定义。

尝试在session_start之前执行session_set_cookie_params(86400),看看我的答案是否适合你。

PHP session 有一个“cookie lifetime”参数,可以用 the session.cookie_lifetime ini setting or the session_set_cookie_params function:

设置

Specifies the lifetime of the cookie in seconds which is sent to the browser. The value 0 means "until the browser is closed." Defaults to 0.

因此,默认情况下,浏览器将被告知仅在关闭之前保留 cookie,但将其设置为零以外的任何值将指示浏览器在未来的特定时间删除 cookie。

例如,生命周期 86400 表示“在启动 session 时,计算未来 24 小时(86400 秒)后的日期,并将其设置为发送到浏览器的 cookie 的到期日期".

重要提示:

  • 要产生任何效果,需要在调用 session_start 之前设置此设置 ,因为届时 PHP 将生成 Set-Cookie header 发送到浏览器。
  • 有一个单独的session.gc_maxlifetime setting决定何时删除服务器上的数据。这应该设置为至少与 cookie 生命周期一样长的值,否则返回的用户可能有一个 session ID cookie,但服务器上没有 session 数据。