首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在javascript卸载前关闭服务器端聊天连接

在javascript卸载前关闭服务器端聊天连接
EN

Stack Overflow用户
提问于 2014-02-14 21:36:02
回答 1查看 104关注 0票数 0

在我的网站上,我已经建立了一个聊天室,支持多个房间。当用户加入这个房间时,一个会话会被放置到数据库中,这样如果他们试图再次在另一个浏览器窗口中加入这个房间,他们就会被锁在外面。

它是这样工作的

代码语言:javascript
复制
1. Join the chatroom page
2. Connect to chatroom #main
If the user has a session in the database for #main
--- Block user from joining
else
--- Load chatroom

当聊天室关闭客户端或用户使用/quit命令终止那里的连接时,他们的所有会话都会被删除,这很好。

然而,

用户可能只是关闭浏览器窗口而不是终止他们的连接。这方面的问题是,他们的会话将留在数据库中,这意味着当他们试图连接到房间时,他们会被阻塞。

我在卸载前使用这段代码来防止

代码语言:javascript
复制
function disconnect() {
        $.ajax({
            url: "/remove-chat-sessions.php?global",
            async: false
        });
};

这也是用户键入/quit命令时调用的函数。

问题

这方面的问题是,当我重新加载页面时,10个会话中有5次没有从数据库中取出,就好像ajax请求失败或页面在完成之前重新加载一样。这意味着当我回到聊天室时,数据库仍然认为我是连接的,并且阻止我进入聊天室。

是否有更好的方法来确保此AJAX调用将加载,如果没有,是否有比将用户会话存储在在线数据库中更好的选择?

编辑:

用户多次被阻止加入房间的原因是,当聊天室更新新消息时,您不会看到发布的消息。当你把它们贴在聊天室的时候,它们会被附加到聊天室的盒子里。这意味着,如果用户可以在同一个聊天室通过多个窗口,他们将无法看到他们张贴在所有窗口的评论。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-14 21:52:43

在这种情况下,您可以添加某种轮询。基本上,您每隔X次使用javascript请求一个页面。该页面将用户会话添加到数据库中。然后有一个脚本每Y次执行一次,其中Y> X,它清理旧会话。

每隔X次调用的脚本

代码语言:javascript
复制
...
// DB call (do as you like)
$All = fetch_all_recent();
foreach ($All as $Session)
  {
  if ($Session['time'] < time() - $y)
    {
    delete_session($Session['id']);
    }
  }

javascript每隔X次调用的脚本

代码语言:javascript
复制
...
delete_old_session($User->id);
add_user_session($User->id, $Chat->id, time());

这种方法的主要缺点是请求的增加,这是Apache不习惯的事情(对于大量的请求)。有两种非排他性的替代方案,涉及对服务器的访问,它们是:

  1. 使用nginx服务器。我没有这方面的经验,但我读过它支持比Apache更多的连接。
  2. 使用一些现代形式的持久连接,比如socket.io。但是,它使用node.js,它可以是好的,也可以是坏的,这取决于您的业务。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21789927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档