如何让 PHP 会话在浏览器关闭或一段时间后过期

Posted

技术标签:

【中文标题】如何让 PHP 会话在浏览器关闭或一段时间后过期【英文标题】:How to have PHP session expire upon browser close OR some extended duration of time 【发布时间】:2011-04-16 05:53:48 【问题描述】:

当用户关闭浏览器时,我的 php 会话设置为过期,但我注意到如果我让浏览器长时间打开(例如 24 小时以上),会话仍然存在。

有没有办法让这些会话在浏览器关闭或经过一段时间后过期?

【问题讨论】:

How do I expire a PHP session after 30 minutes? 的可能重复项 浏览器关闭时:不,不能那样工作。否则请参阅 Palantir 链接的问题。 @fredley:你是什么意思不,它不那样工作?当我查看我的 cookie 时,我的 php sessid 设置为在浏览器关闭时过期。 也见这里***.com/questions/777767/firefox-session-cookies 【参考方案1】:

解决方案可能是通过ini_set('session.gc_maxlifetime', <lifetime in seconds>); 设置数据当然如果可以通过PHP 更改配置。否则,您需要在 php.ini 中设置正确的值:

ini_set(‘session.gc_maxlifetime’,30);
ini_set(‘session.gc_probability’,1);
ini_set(‘session.gc_divisor’,1);

另一种方法是设置会话cookie的有效性:

$expire=24*60*60;
session_set_cookie_params($expire);
session_start();

【讨论】:

垃圾收集器是要走的路,因为当你摆弄 cookie 的生命周期时,cookie 不会在浏览器关闭时消失。请务必对未经授权的用户致电session_regenerate_id(),以防止会话固定。 @Wrikken 您是否建议在我捕获未经授权的用户时调用 session_regenerate_id ? 使用 1 作为除数和概率可以确保我们始终检查 CPU 密集型的垃圾,对吧? @chris:你可以根据$_SESSION数组中的一个变量来做:session_start();if(!isset($_SESSION['id_generated_by_server'])) session_regenerate_id(); $_SESSION['id_generated_by_server'] = true; 依靠垃圾收集器为你做超时不是一个好主意。它只在 RANDOM 时间表上启动。最好将一些超时检查放入会话处理程序本身,如果空闲时间超过超时,则强制重新验证或其他操作。

以上是关于如何让 PHP 会话在浏览器关闭或一段时间后过期的主要内容,如果未能解决你的问题,请参考以下文章

PHP会话cookie在浏览器关闭时过期

php的会话技术

PHP 会话在 40 分钟后到期

将cookie设置为在会话结束时过期?网

如何在 Spring Boot 测试中模拟会话关闭/过期?

如何让用户会话持续 24 小时?