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

9

如何保持用户会话的活动状态,即使他们意外关闭了浏览器。例如像Facebook一样。

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

我该怎么做?

4个回答

26

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

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

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

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

7

如果有人遇到了同样的问题,要使会话cookie保持长时间很容易,在登录表单上,当您第一次创建会话时,请使用以下代码,它将设置Cookie时间为一年(根据需要使用自己的时间)。

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

那应该设置PHPSESSID cookie,这样你的会话就会安全了...但这不是最安全的方式,所以如果你不在意安全问题可以使用它。

4

仅更改该值是不够的,您还需要控制 session.gc-maxlifetime 才能使其正常工作(有关详细信息,请参见我的答案)。 - reko_t

0

你应该使用cookies: http://php.net/manual/zh/function.setcookie.php

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

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


在 PHP 会话中不使用 setcookie。是的,您总是可以“自己编写”会话处理程序,但 PHP 的内置会话处理程序是一个更简单的解决方案,并且它有设置会话生命周期的方法。 - Machavity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接