【问题标题】:User still online after closing page关闭页面后用户仍然在线
【发布时间】:2013-04-11 03:05:55
【问题描述】:

我正在使用 php 登录脚本。 (我有一个愚蠢的初学者问题)计划是在 1 小时后使用 cookie 注销用户。

但是,如果用户没有按下注销按钮,则用户保持在线(在我的数据库表上,我的 MySQL db 上保持打开记录)当我删除该记录时,一切正常,用户可以登录。

有人可以帮帮我吗? 我是否需要让他脚本删除我的会话或其他内容?

解决方案:问题是我只需要删除(确保)在用户想要再次登录之前删除用户登录数据。所以我做了一个小脚本,如果他想登录,它会为用户删除一个打开的会话。毕竟我停止使用我自己的代码。现在我正在使用 CodeIgniter,效果很好!

【问题讨论】:

    标签: php mysql database login


    【解决方案1】:

    确实,这就是会话通常的工作方式。一旦页面被加载,浏览器和服务器之间就不再有连接了。基本上,一旦一个页面完成加载并且只是停留在浏览器中,它就已经和用户关闭窗口一样了。

    没有办法 100% 可靠地检测用户是否仍然“在线”。为此,您必须让 Javascript 持续发送心跳,但即便如此,它也归结为 超时。如果您有一段时间没有看到该用户,则假设他处于离线状态并删除会话。这就是你所能做的。

    【讨论】:

    • 所以你的意思是 cronjob?还是有其他方法可以做到这一点?
    • 有很多不同的方法,取决于你的情况。一种完全“被动”的方式是永远不要删除任何东西,只使用适当的查询 (SELECT ... WHERE last_seen > DATE_SUB(NOW(), INTERVAL 1 HOUR))。其次,您可以通过在随机请求(例如if (mt_rand(0, 1000) == 1000) run_cleanup())上运行一些垃圾收集有时来完成“穷人的 cron 作业”。PHP 的会话处理就是这样做的。最后,您可以使用真正的 cron 作业。在一个现实世界的应用程序,你通常会同时拥有这三者。
    • @Roy 你没有删除记录,你可以永远保留它们(我不一定提倡这个想法,只是指出它)。我不知道为什么这会阻止您的用户登录,它没有必要。如果是这样,那是您的具体问题。
    • @Roy 我不明白这个问题。在我看来,您的登录/会话系统无法正常工作,因为您对如何删除会话以及并行会话应该如何工作做出了错误的假设。你应该修正你的方法并首先理解。
    • 你好,我创建了一个新的 sql 删除。当用户登录时,这将触发并从​​用户那里删除会话(如果存在)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2012-03-05
    • 2012-02-20
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多