在我的网站上,我已经建立了一个聊天室,支持多个房间。当用户加入这个房间时,一个会话会被放置到数据库中,这样如果他们试图再次在另一个浏览器窗口中加入这个房间,他们就会被锁在外面。
它是这样工作的
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命令终止那里的连接时,他们的所有会话都会被删除,这很好。
然而,
用户可能只是关闭浏览器窗口而不是终止他们的连接。这方面的问题是,他们的会话将留在数据库中,这意味着当他们试图连接到房间时,他们会被阻塞。
我在卸载前使用这段代码来防止
function disconnect() {
$.ajax({
url: "/remove-chat-sessions.php?global",
async: false
});
};这也是用户键入/quit命令时调用的函数。
问题
这方面的问题是,当我重新加载页面时,10个会话中有5次没有从数据库中取出,就好像ajax请求失败或页面在完成之前重新加载一样。这意味着当我回到聊天室时,数据库仍然认为我是连接的,并且阻止我进入聊天室。
是否有更好的方法来确保此AJAX调用将加载,如果没有,是否有比将用户会话存储在在线数据库中更好的选择?
编辑:
用户多次被阻止加入房间的原因是,当聊天室更新新消息时,您不会看到发布的消息。当你把它们贴在聊天室的时候,它们会被附加到聊天室的盒子里。这意味着,如果用户可以在同一个聊天室通过多个窗口,他们将无法看到他们张贴在所有窗口的评论。
发布于 2014-02-14 21:52:43
在这种情况下,您可以添加某种轮询。基本上,您每隔X次使用javascript请求一个页面。该页面将用户会话添加到数据库中。然后有一个脚本每Y次执行一次,其中Y> X,它清理旧会话。
每隔X次调用的脚本
...
// 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次调用的脚本
...
delete_old_session($User->id);
add_user_session($User->id, $Chat->id, time());这种方法的主要缺点是请求的增加,这是Apache不习惯的事情(对于大量的请求)。有两种非排他性的替代方案,涉及对服务器的访问,它们是:
https://stackoverflow.com/questions/21789927
复制相似问题