php会话在什么时候关闭,关于php:destroy会话在窗口关闭?

我用注销功能等在php中创建了一个登录系统。但是我需要在关闭窗口时销毁会话。 这需要"立即"或尽可能快地将用户状态更改为脱机。 我真的不想在会话上设置时间,因为这使用户不得不一直登录。

任何建议都欢迎,谢谢。 =)

默认情况下,浏览器关闭时,将删除PHP发送的所有会话cookie。但据我所知,您想在其他浏览器上显示通知。这有点难,也不是很好。您必须使用window.onclose事件处理程序,并向服务器发出Ajax请求(我认为它应该是同步请求),以发出关闭窗口的信号。同步调用不是很好...

另一方面,另一个浏览器将不得不通过其他Ajax请求拉动服务器,以查看某个用户何时注销。

所有这些Ajax请求都提出了一个丑陋的解决方案。

更新:

正如Thorarin和Jonathan Fingland所说,多个窗口可能存在问题(不是选项卡,因为window.onclose会在窗口上触发而不是选项卡),但我相信也可以解决此问题。如果第一个窗口设置的cookie number_of_windows = 1,对于每个打开的窗口都递增,那么在窗口关闭时,仅当number_of_windows等于1时才触发Ajax请求,否则将递减number_of_windows。

更新2:

实际上,上述解决方案在使用多个打开的选项卡时会遇到麻烦。我正在考虑如何减轻这种情况。

更新3:

好的,我找到了某种解决方案,但它在IE6中不起作用,不了解其他IE版本。下面的代码片段跟踪打开的窗口和选项卡的数量(IE不会在窗口之间实时更新document.cookie,但我相信可以使用IE专有功能来解决)。然后在每个页面上卸载,这意味着即使在同一网站上从一个页面浏览到另一个页面,脚本也会检查以查看有多少打开的窗口。如果这是唯一打开的窗口/选项卡,那么它将发出Ajax请求。这是解决方案的第一部分。现在,第二部分。

在服务器端,Ajax调用所请求的脚本应更新数据库中的某些条目,表明用户可能已关闭页面。您如何看待她是否不仅仅是在访问您网站上的新页面?很简单,在每个页面访问中,您都需要检查数据库中该会话的"可能已注销"值,如果有,则将它们标记为false(用户已登录),否则用户将继续在数据库中注销(true旗)。

这很麻烦,但这是我想到的唯一解决方案,因为我无法确定JavaScript中的页面重新加载等。另外,我没有做广泛的测试,更是一个主意。无论如何,我不会推荐这种解决方案。对于每个更改的页面的Ajax请求都是过大的,实际上会使服务器上的点击次数翻倍,而没有计算其他浏览器进行的轮询。

这是代码段。顺便说一句,bakery.js是document.cookie的小型包装。您可以在github上找到其来源。

var logout = function() {

var xhr = new XMLHttpRequest;

xhr.open("GET","logout.php", false);

xhr.send(null);

};

window.onload = function() {

var winNumber = parseInt(IGS.Bakery.getCookie("winNumber"), 10) || 0;

IGS.Bakery.setCookie("winNumber", winNumber + 1);

};

window.onunload = function() {

var winNumber = parseInt(IGS.Bakery.getCookie("winNumber"), 10) || 0;

IGS.Bakery.setCookie("winNumber", winNumber - 1);

if (winNumber === 1) {

logout();

}

};

var showCookies = function() {

alert(IGS.Bakery.getCookie("winNumber"));

};

show

忘了提。 window.onclose不是跨浏览器。

如thorarins示例所指出的那样,它也不能可靠地工作,因为可以在同一站点上打开多个窗口/选项卡。 第一个关闭将导致会话被杀死

@Jonathan Fingland,我用可能的解决方案更新了答案。 等待反馈。

示例代码是否有可能做到这一点? 由于我不完全了解如何设置窗口cookie的数量。 再次感谢

@Elliott,刚刚发布了某种解决方案。 但是答案基本上是不可能的。

非常感谢,一定有办法吗? 用户关闭浏览器时,facebook等网站如何处理?

可能是Hardwareguy建议的方式。 这似乎是理智的解决方案。

您可以使用JavaScript来实现OnUnload事件,并可以使用AJAX交流离开该网站的用户。但是,当他们导航到另一个页面时,也会发生该事件。您必须实施类似"如果用户在x秒内不请求新页面"之类的东西,他已经离开了我的网站,但是如果考虑到多个窗口被打开的可能性,它将永远无法可靠地工作。

唯一的方法是对用户仍在页面上的服务器进行定期的AJAX回发。但这仍然不是瞬间。

您可以尝试试验要发布回的脚本。在做出回应之前,需要等待大量时间。当用户离开您的页面时,浏览器可能会中止正在进行的XmlHttpRequest。您的服务器端脚本可以注册断开连接的客户端,并得出用户再次离开...的结论,除非他们继续加载另一个页面。

简而言之,没有明确的方法可以做到这一点。

好的,谢谢,那给了我一个更好的主意,我认为不会有"简单的方法"。

您可以将实际登录时的"显示为已登录"的概念分开。例如,每次用户请求页面时,您都可以将其标记为"在线"几分钟,但您可以将其实际登录超时设置为几个小时 。 在这种方案中,如果用户离开计算机,该站点将在几分钟后显示为"脱机",但他们仍然可以在一个小时左右的时间内返回,而不必重新登录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值