【问题标题】:How to delete data from database when session dont exists会话不存在时如何从数据库中删除数据
【发布时间】:2011-04-11 12:51:13
【问题描述】:

我正在为我的应用程序开发一个聊天模块...

  1. 我正在为用户打开一个聊天窗口,当用户关闭聊天窗口时,我可以更新该记录的状态...我的意思是关闭浏览器的事件?

  2. 我知道默认会话时间是 24 分钟, 因此,在 24 分钟不活动后,用户将被踢出站点并要求再次登录。

当用户 24 分钟没有活动时(当用户因不活动而从会话中注销时)如何删除/刷新我的数据库中的数据?

【问题讨论】:

    标签: javascript php session dom-events


    【解决方案1】:

    1) 您需要为此使用 javascript onUnload 事件。它将向您的网络服务器发送一个异步查询,设置用户的离线状态。但是,您不应仅依赖此事件,还应设置 24 分钟自动离线超时,因为不能保证用户正在使用 javascript。

    2) 我认为您最好的选择是运行一个 cron 作业(每 30 分钟左右一次?),该作业会查询您的数据库,识别上次活动超过 24 分钟前的用户,然后删除相关数据。

    【讨论】:

    • 如果我每 30 分钟运行一次 cron 作业,对我的服务器是否有任何影响...我的意思是我听说在 cron 作业时服务器会很慢,这是真的
    • 我如何从数据库用户表中知道其活动时间超过 24 分钟...我应该存储不活动时间还是什么?
    • 好吧,每 30 分钟运行一次 cronjob 肯定比在每次页面加载时检查它要好。根据您的数据库的大小,这 30 分钟的解析可能会减慢服务器速度,是的。你真的需要每 24 分钟删除一次数据吗?如果没有,例如,您可以每天凌晨 2 点设置一个 cronjob,以最大程度地减少速度
    • 您应该存储用户最后一次操作的时间戳。然后在清理脚本上,您可以在保存的时间和实际时间之间进行简单的时间减法。如果差异大于 24 分钟,请清理它
    【解决方案2】:

    将每个聊天条目的时间戳存储在UNIX_TIMESTAMP 中。当一个新的聊天条目传入时,检查每个时间戳小于现在的条目时间戳 - 24 分钟。踢用户。

    【讨论】:

      【解决方案3】:

      1) 使用卸载事件

      2) 如果您正在开发聊天,我猜您有一个定期调用服务器以检索消息的功能。每次调用此函数时,即使用户没有发送消息,也会重置不活动时间。如果你想在用户在 24 分钟内没有写任何东西时注销用户,你不能依赖 php 会话。

      您可以做的是:保存在数据库中,用户最后一次在聊天中写消息,每次使用您的期刊功能时,验证用户在过去 24 分钟内是否没有写任何东西

      【讨论】:

        【解决方案4】:

        对事件使用 javascript 函数
        window.onbeforeunload = myLogoutFunction;

        注意:此 javascript 在浏览器崩溃时不起作用。

        有一个 user_log 数据库表并在其中填写登录和“注销”日期。 当有用户未更新注销日期时,您可以认为他的连接有问题。

        $where = " AND `users_id`='".$response['userfound']['id']."'";
        $where .= " AND `logoffdatetime`='0000-00-00 00:00:00'";
        

        24 分钟后 php 会话消失(默认 php.ini 设置)。用处不大。但是你仍然可以保存到 user_log 表中。

        您不需要刷新数据库。 通过数据库保持聊天用户活跃是个坏主意。而是使用一个带有时间戳的小文件。

        这里有一些其他有用的提示 检测用户是否在没有注销的情况下返回

        $user_navigates = false;
        if(isset($_SERVER['HTTP_REFERER']) && basename($_SERVER['HTTP_REFERER']) != _PAGE)
        $user_navigates = true;
        

        将页面刷新也保存到会话中

        if(isset($_GET['pagerefreshed']))
        $_SESSION['pagerefreshed'] = $_GET['pagerefreshed'];
        

        将注销的 user_id 保存到会话中,以便您可以使用它来恢复。例如不需要重新加载页面。

        $_SESSION['loggedout']['user_id'] == $login->user_id
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-22
          • 2012-02-02
          • 2021-12-30
          • 2021-06-08
          • 1970-01-01
          • 1970-01-01
          • 2012-06-01
          相关资源
          最近更新 更多