当用户关闭浏览器后,我可以使会话存活吗?


Can I make a session alive after when user closes his browser?

我正在尝试实现一个系统,以保持用户登录一段时间。我可以通过使用cookie并将其存储到数据库中,然后识别他。

但是最近我听说即使用户关闭浏览器并打开一个新窗口,会话也可以存活。我的意思是一个会话仍然可以关闭/打开浏览器后再次(或甚至多次)?


(最大)我可以在以下脚本中使用$_SESSION["LoginValidation"]多少时间?

<?php
session_start();
$_SESSION["LoginValidation"] = ture;

当前该会话在关闭浏览器之前是可用的。

为了使会话在关闭浏览器后持续存在,您需要为会话cookie设置一个过期时间。没有过期时间的cookie 在浏览器关闭时被删除,通常称为会话cookie(与PHP会话不同-只是相关)。

(旁注:如果您的浏览器在退出时配置为"保存打开的选项卡",则会话cookie可能会被浏览器保存,即使它们应该被删除)

所以你可以设置session。将Cookie_lifetime设置为较大的值。但是,这并不能阻止存储在服务器上的会话数据被删除—为了使数据保持更长时间,您需要提高session.gc_maxlifetime的值。

但是这是错误的解决方法

实现这种持久会话有安全和容量方面的问题——你当然不应该将其作为默认行为实现——只有在用户明确表示同意的情况下。

使用"记住我"cookie作为一种轻量级会话系统是最佳实践解决方案。给它一个随机值(建议你使用一个合理可靠的随机数来源,例如base64_encode(openssl_random_pseudo_bytes(64))和一个与其他cookie不冲突的名称),并将它与你真正想要在实际会话中保存的数据(例如经过身份验证的用户名)一起存储。

方法1)session.cookie-lifetime:这是cookie的生命周期,默认为0,这意味着当浏览器关闭时cookie将被销毁。可以通过增加这个变量来设置更长的生命周期。它是相对于服务器时间而言的,因此您需要考虑客户机机器和服务器机器的时间差异。还有session.gc-maxlifetime,这是会话数据在存储中被视为垃圾并被销毁的时间。

虽然您可以将这些设置设置为相对较高的值并使其工作,但我建议不要这样做,因为这会在会话存储中留下大量不必要的会话数据,因为GC不会收集实际的失效会话

或另一种方法是,即使在浏览器关闭后,会话也可以保持活动状态,将会话保存在db中并获取其id,并通过

在用户cookie中设置该id
setcookie("name","value",time()+$int);

所以你可以从$_COOKIE["name"];中获取这个值使用它从数据库中获取会话变量