定时自动注销和关闭浏览器
定时自动注销和关闭浏览器
我为了学习目的创建了一个非常简单的多用户游戏。
当用户登录时,其他用户会收到所有当前登录用户的更新。
当用户登录时,它只是在SQL数据库中为该用户设置一个值为1。当他们退出登录时,该值应该为0。
我正在使用$(window).unload(function() {});来尝试捕捉标签/浏览器关闭,但它只能部分工作。
两个问题:
1.有没有更好的方法来捕捉浏览器或标签关闭?
2.如果它错过了标签关闭,或者他们的机器崩溃,或者网络连接断开,或者用户只是离开机器,我希望自动将他们注销。
我正在使用HTML/Jquery前端和PHP后端。为了实现第二个问题,我应该做些什么?我假设我需要在PHP中做这个...我们假设浏览器很可能已经不存在,因此不处理jquery的东西。PHP是否可以在连续的定时器上执行某些操作,以检查用户是否仍在登录...而不仅仅是让用户每隔10秒点击一个按钮?
编辑:
这里有一个潜在的解决方案:如何检测用户是否已在PHP中注销?
但是我正在使用ajax来避免页面刷新。理想情况下,用户将永远不会刷新页面或点击任何按钮(请记住,我正在测试,这不是一个真正的应用程序)。PHP是否会在没有完整页面刷新的情况下看到最后的活动?
编辑2:
我已经将以下代码添加到我的PHP中,并使用setInterval添加了相应的jquery函数
if (isset ($_POST['keepalive'])) { if (filter_input(INPUT_POST,'keepalive') == '1') { $name = $_SESSION['name']; $time = time(); mysql_query("UPDATE tictac_names SET keep_alive = '$time' WHERE name ='$name'") or die(mysql_error()); } }
这将一个Unix epoc时间戳插入到我的表中,对于简单的计算非常容易。
现在我的问题是:如何告诉PHP每隔X秒运行一次检查每个已登录用户的代码?我的PHP后端文件主要用于捕捉POST变量并运行代码,然后将其返回给jquery。由于该代码旨在注销非活动的浏览器/用户,我不能依赖jquery发送请求给PHP,并且没有PHP的刷新。我需要做一些cron作业或一些奇怪的事情来让PHP检查所有在最后X秒内没有更新的用户吗?
求助!
问题:timed auto logout and browser close的原因和解决方法
在使用HTML5的socket连接作为与服务器连接的方式时,socket服务器脚本可以知道何时有订阅者断开连接。这也允许您实时向所有客户端推送数据,而无需进行长轮询。唯一的问题是我不知道目前HTML5 sockets的支持情况。我以前使用过Flash进行类似操作,Flash也支持socket连接。
解决方法:
1. 使用HTML5的socket连接作为与服务器连接的方式。
2. 在socket服务器脚本中实现对订阅者断开连接的检测。
3. 在断开连接时执行相应的操作,例如自动登出用户或关闭浏览器。
4. 如果HTML5 sockets的支持不确定,可以考虑使用Flash作为替代方案。
5. 可以参考tenthtower.com网站来了解实际应用示例。
问题的出现原因:
- 当用户关闭浏览器或者超过特定时间没有活动时,会导致会话(session)过期。
解决方法:
- 可以使用基于$_SESSION的解决方案来处理这个问题。
- 可以参考用户Gumbo在stackoverflow上的回答来实现。他提供了一个解决方案,可以在用户关闭浏览器时销毁或取消会话。
- 可以适应你的数据库需求对其进行调整。
代码示例:
// 开始会话 session_start(); // 设置会话过期时间(以秒为单位) $session_timeout = 1800; // 30分钟 // 检查会话是否已经过期 if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > $session_timeout)) { // 会话过期,销毁会话 session_unset(); session_destroy(); } // 更新会话的最后活动时间 $_SESSION['last_activity'] = time();
这段代码首先开启会话(session),然后设置会话的过期时间为30分钟。接下来,它会检查会话的最后活动时间是否超过了设定的过期时间。如果超过了,会话将被销毁并清除。最后,它会更新会话的最后活动时间。
你可以根据自己的需求对这段代码进行修改和适应。
问题的原因是用户长时间不活动导致自动注销和浏览器关闭。为了解决这个问题,可以使用以下方法:
1. 在SQL数据库中为每个登录用户定期更新时间戳。可以设置一个脚本,在用户活动时定期更新时间戳。
// 更新用户时间戳 UPDATE users SET last_active = NOW() WHERE user_id = ?
2. 编写另一个脚本,定期检查时间戳是否超过指定的时间段(例如10秒)。如果时间戳超过指定时间段,将用户设置为未登录状态。
// 检查时间戳并设置用户状态 UPDATE users SET is_logged_in = 0 WHERE last_active < (NOW() - INTERVAL 10 SECOND)
3. 如果你使用AJAX,可以在后台定期调用一个PHP脚本来设置和检查SQL表中的时间戳。
setInterval(function() { $.ajax({ url: 'check_timestamp.php', type: 'POST', success: function(response) { console.log('Timestamp checked successfully'); } }); }, 10000); // 每10秒调用一次脚本
通过以上方法,可以定期检查用户的活动状态并自动注销不活动的用户,从而解决自动注销和浏览器关闭的问题。