如何在浏览器关闭的情况下保持PHP会话处于活动状态


How to keep a PHP session active even if the browser is closed?

即使用户意外关闭了浏览器,我如何保持用户的会话处于活动状态。比如在Facebook上。

如果你登录到他们的网站并关闭选项卡或浏览器,当你再次打开浏览器并访问Facebook时,他们会自动检测到活动用户,不会将你重定向到登录页面。

我该怎么做?

有两个相关设置控制会话的生存期。

第一个是session.cookie-lifetime。这是cookie的生存期,默认情况下为0,这意味着浏览器关闭时cookie会被销毁。您可以通过增加此变量来设置更长的使用寿命。它与服务器时间有关,因此您需要考虑客户端机器和服务器机器中的时间差异。假设它们是相同的,将选项设置为即3600将意味着会话将在一小时内过期。如果你想让会话保持很长一段时间,你可以增加这个数字。

然而,仅更改此值是不够的。还有session.gc-maxlifetime,这是会话数据在存储中被视为垃圾并被销毁的时间。这与session.cookie-lifetime不同,因为此选项检查会话数据的最后访问时间,因此它与会话数据上次使用的时间(即用户上次活动的时间)有关。即使您将session.cookie生存期设置为一个高值,这也是不够的,因为session.gc_maxlifetime通常相对较低(默认值为1440,仅为24分钟)。

虽然您可以将这些设置都设置为相对较高的值并使其正常工作,但我建议您不要这样做,因为这会在会话存储中留下大量不必要的会话数据,因为GC没有收集实际的死会话(这也会增加有人在未经适当保护的系统中劫持会话的机会)。更好的方法是制作记住我cookie。基本上,您为cookie中的每个用户分配用户ID和存储在数据库中的一些身份验证令牌(这是为了防止有人欺骗cookie),并使其具有较长的使用寿命。在应用程序的初始化代码中,您将检查用户是否已登录。如果他/她未登录,则检查是否设置了记住我cookie。如果是,则根据cookie中的用户ID从数据库中提取用户,然后验证数据库中的身份验证令牌是否与cookie中的相同。如果它们匹配,只需创建会话并自动让用户登录即可。

对于遇到同样问题的人来说,长时间保持会话cookie设置很容易,在登录表单上,当你第一次使用此代码创建会话时,它会将cookie时间设置为一年(根据需要使用你自己的时间)。

ini_set('session.cookie_lifetime', 60 * 60 * 24 * 365);
ini_set('session.gc-maxlifetime', 60 * 60 * 24 * 365);
session_start();

这应该设置PHPSSID cookie,您的会话将是安全的。。。但不是最安全的方法,所以如果你不介意安全问题,请使用它

默认情况下,PHP会一直打开用户的会话,直到他们的浏览器关闭。您可以通过更改session.cookie-lifetime INI设置来覆盖该行为:

http://www.php.net/manual/en/session.configuration.php

但是,请参阅rekot帖子以获得完整答案

您应该使用cookie:http://php.net/manual/en/function.setcookie.php

只需在那里存储一些独特的值,就可以帮助您识别用户。

无论如何,我强烈建议您使用某种框架,如CodeIgniter或Zend框架,除非您只是在学习它的工作原理。在这样的代码中很容易犯严重错误,而且大多数框架都经过了良好的测试,可以安全使用。