如何在PHP中处理浏览器关闭注销?

时间:2012-11-27 09:57:04

标签: php mysql ajax

登录用户关闭浏览器时遇到问题。 由于浏览器关闭,我的代码无法运行,因此他们的logonstatus无法在数据库中更新为“N”。同样由于会话被破坏,他们无法返回主页面,因为我有这段代码if (!isset($_SESSION['logged in'])) {等,以防止人们在没有登录的情况下查看任何页面。

当用户登录他们的logonstatus更改为“Y”并记录他们登录的时间。 我记录每个页面加载的最后活动时间。 我将用户重定向到登录页面,如果他们在页面上空闲了20分钟,则更改他们的logonstatus。 我也有一个cron作业,因为浏览器关闭问题每5分钟运行一次并检查用户上次活动是否超过20分钟,如果是这样,他们的logonstatus变为'N'<​​/ p>

我认为由于浏览器关闭而需要等待20多分钟才能重新登录的用户太长,所以我希望能够立即再次登录。

我已经阅读过javascript的卸载功能,但显然它不可靠。

还有其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您需要更改会话Cookie的持续时间,以便只要浏览器窗口保持打开就会持续;使用session_set_cookie_params执行此操作,将生命周期设置为0。不要忘记确保您的cron脚本和PHP的会话gc max lifetime在20分钟之前不会删除会话。

由于您保留了上次访问时间的记录并在每次请求时进行检查,因此您可以在20分钟不活动后继续注销人员(只需销毁其会话并重定向到登录页面)。

答案 1 :(得分:1)

关闭浏览器始终是客户端操作。因此,您需要使用javascript将操作发送到服务器,以便PHP执行某些操作。

您可以使用onbeforeunload向服务器发送内容,但确实不可靠。一种更可靠的方法是缩短会话时间(例如:2分钟),然后每30秒向服务器调用一次ajax,以使会话保持活动状态(确保其页面对服务器/连接的影响非常小) 。如果请求失败4次,则会话被销毁。现在你的cronjob可以每2分钟运行一次,用户只需要等待那么长时间。

另一种方法是使用GUID在用户计算机上存储cookie,并使用“Logged ='Y'”将其保存在数据库中。现在当有人试图登录已经登录的帐户时,检查它是否是同一个用户(cookie),如果有,请允许它。 这仍然使一个用户可以登录两次,更难,而不是错误。