【问题标题】:How to Track the Online Status of Users of my WebSite?如何追踪我网站用户的在线状态?
【发布时间】:2010-11-08 05:15:13
【问题描述】:

我想跟踪当前在线的用户。

在线的定义是当他们在网站的索引页面上时 有聊天功能。

到目前为止,我能想到的只是为用户设置一个 cookie,当下次访问时找到 cookie 时,会进行 ajax 调用以使用用户名、在线状态和时间更新表。

现在我的实际问题是,当他们离开时,我怎样才能可靠地将他们的状态变为关闭 网站?我唯一能想到的就是设置一个预定的无用户交互时间,然后将状态设置为关闭

但我真正想要的是保持状态on,只要他们在网站上,不管有没有交互,只有在他们离开时才off网站。

【问题讨论】:

    标签: session real-time


    【解决方案1】:

    完整的解决方案。从头到尾。

    如果您只想在 index.php 页面上进行此操作,您可以异步(AJAX 样式)向服务器发送更新,提醒服务器 $_SESSION["userid"] 仍然在线。

    setInterval("update()", 10000); // Update every 10 seconds
    
    function update() {
      $.post("update.php"); // Sends request to update.php
    }
    

    您的 update.php 文件将包含如下代码:

    session_start();
    if ($_SESSION["userid"])
      updateUserStatus($_SESSION["userid"]);
    

    这一切都假设您在用户登录您的网站时将您的用户 ID 存储为会话变量。 updateUserStatus() 函数只是一个简单的查询,如下所示:

    UPDATE users 
    SET lastActiveTime = NOW()
    WHERE userid = $userid
    

    这样就可以处理您的存储了。现在检索“在线”用户列表。为此,您需要另一个 jQuery 调用和另一个 setInterval() 调用:

    setInterval("getList()", 10000) // Get users-online every 10 seconds
    
    function getList() {
      $.post("getList.php", function(list) {
        $("listBox").html(list);
      });
    }
    

    此函数每 10 秒向服务器请求一些 HTML。 getList.php 页面如下所示:

    session_start();
    if (!$_SESSION["userid"])
      die; // Don't give the list to anybody not logged in
    
    $users = getOnlineUsers(); /* Gets all users with lastActiveTime within the
                                  last 1 minute */
    
    $output = "<ul>";
    foreach ($users as $user) {
      $output .= "<li>".$user["userName"]."</li>";
    }
    $output .= "</ul>";
    
    print $output;
    

    这将输出以下 HTML:

    <ul>
      <li>Jonathan Sampson</li>
      <li>Paolo Bergantino</li>
      <li>John Skeet</li>
    </ul>
    

    该列表包含在名为“list”的 jQuery 变量中。回头看看我们最后一个 jQuery 块,你会在那里看到它。

    jQuery 将获取此列表,并将其放在类名为“listBox”的 div 中。

    <div class="listBox"></div>
    

    希望这能让你继续前进。

    【讨论】:

    • +1 以我的名字为例并正确使用 ;) 这里唯一的抱怨是 setInterval("update()", 10000);最好写成 setInterval(update, 10000); getList 也是如此。
    • (显然你必须事先声明函数)
    • 感谢 cmets,Paolo。调用“update()”来“更新”有什么好处?
    • 本身没有好处,使用超时/间隔的引用功能只是一种不好的做法。最好创建一个像 setTimeout(function() { ... }) 这样的匿名函数,或者简单地传递您想要调用的函数名称。这真的没什么大不了的,但一些“大牌”(Resig、Crockford)不喜欢它,我同意他们的看法。
    • 有关更多信息,请查看此问题:stackoverflow.com/questions/797115/… 和此链接:developer.mozilla.org/en/DOM/window.setTimeout,其中显示“替代语法中的代码,是您要在延迟毫秒后执行的代码字符串。(不推荐)"
    【解决方案2】:

    在一般情况下,无法知道用户何时离开您的页面。

    但是您可以在幕后做一些事情,以便他们在页面上时经常从您的服务器加载某些内容,例如。通过加载带有每分钟重新加载的一些内容的&lt;iframe&gt;

    <meta http-equiv="refresh" content="60">
    

    这会导致一些小的额外服务器负载,但它会做你想做的事(如果不是第二个)。

    【讨论】:

    • 我从未使用过 iframe。所以我会在 iframe 中每分钟更新一次 mysql。我会将 I 框架设置为隐藏在索引页中吗??
    • 并且用户没有看到页面刷新了 iframe??
    • 你可以让它显示一些有用的东西,比如“N 个在线用户”。那么它明显地自我更新是正确的。
    • 这不是个好主意...最好使用javascript代码
    【解决方案3】:

    那么,聊天功能是如何工作的?它是基于 ajax 的聊天系统吗?

    基于 Ajax 的聊天系统由客户端持续访问聊天服务器以查看队列中是否有任何新消息。如果是这种情况,您可以在 cookie 或 PHP 会话中更新用户的在线状态(当然,假设您使用的是 PHP)。然后您可以将在线超时设置为略长于更新频率。

    也就是说,如果您的聊天系统通常每 5 秒向服务器请求一次新消息,那么您可以假设任何 10-15 秒未发送请求的用户都不再在聊天页面上。

    如果您没有使用基于 ajax 的聊天系统(可能是 Java 或其他),那么您仍然可以通过添加定期发送到服务器的 ajax 请求来确定用户是否在线来完成同样的事情.

    我不建议将此在线状态信息存储在数据库中。每隔几秒钟查询一次数据库以查看谁在线和谁不在线是非常耗费资源的,特别是如果这是一个大型站点。您应该缓存这些信息并在缓存(非常快)与数据库(相比之下非常慢)上进行操作。

    【讨论】:

      【解决方案4】:

      问题被标记为“jquery” - javascript 解决方案怎么样?你可以使用window.setInterval(),而不是meta/refresh,执行一个ajax请求并提供一些“有用”的东西,例如更新的“谁在线”列表(如果您认为这有用 ;-))

      【讨论】:

        【解决方案5】:

        我还没有尝试过,所以请谨慎对待:为 window.onunload 设置一个事件处理程序,当用户离开页面时通知服务器。这样做的一些问题是 1.) 如果浏览器或计算机崩溃,该事件不会触发,以及 2.) 如果用户打开并关闭了一个索引页面的两个实例,除非您实现引用计数,否则它们将显示为注销.就其本身而言,这并不可靠,但结合 Jonathan 的轮询方法,应该可以让您有很好的响应时间和更大的更新间隔。

        【讨论】:

          【解决方案6】:

          最终的解决方案是使用 websocket 实现一些东西。

          【讨论】:

            猜你喜欢
            • 2012-07-18
            • 1970-01-01
            • 2015-03-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多