即使浏览器意外关闭,如何保持会话活动?

时间:2012-02-17 09:08:24

标签: php

我想在我的网站上添加一些内容。

即使用户意外关闭浏览器,如何保持用户的会话处于活动状态。就像在facebook中一样。

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

我该怎么做?

4 个答案:

答案 0 :(得分:21)

有两个相关设置可以控制会话的生命周期。

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

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

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

答案 1 :(得分:6)

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

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

那应该设置PHPSESSID cookie并且你的会话是安全的...但不是最安全的方式,所以如果你不介意安全问题就使用它

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:0)

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

只需存储一些可帮助您识别用户的唯一值。

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