我目前正在开发一个聊天系统,仅仅是为了提高自己作为程序员的意义,因为我还很年轻(17)。当用户登录时,消息“{user}已进入聊天”。在聊天中显示。同样,当用户注销时,消息“{user}已离开聊天”。得到了显示。
这两种功能都可以正常工作。但是,我还想确定用户何时关闭页面(留言)以及何时回来(输入消息)。
为了做到这一点,我做了以下几点:
1,在主聊天页面(chat.php)上,我设置了一个名为onpage
的会话
2,当用户离开页面时,以下脚本将通过AJAX(jQuery)在onbeforeunload
事件中运行:
//setoffline.php
unset($_SESSION["onpage"]); // unset the session
if ($_POST['logout'] == "false") { // in our case, this will evaluate true
sleep(3); // halt the script for 3 seconds
if (isset($_SESSION["onpage"]) || !empty($_SESSION["onpage"]))
die();
}
}
// if continued, send the offline message
...
$_SESSION["left"] = "true";
3,脚本运行,然后在检查会话是否仍然存在之前休眠三秒钟(如果用户在三秒内返回会话将被重置)。如果没有则:脚本将完成,将发送离开消息,并将设置会话left
。
4,当用户返回时,会触发一个onload函数,用于检查会话left
。如果已设置,则将发送输入消息,并且将取消设置会话left
。
问题:
到目前为止,我确信您已经确定了我的算法问题。我自己看到很多问题。例如,使用sleep
函数似乎不对,也不正常。它在关闭页面时正常工作(因为没有人在3秒内返回),但是当你刷新时,它会导致页面暂停三秒钟,这是我不想要的。我只想找到一种方法来识别用户何时正式离开并共轭返回页面。
答案 0 :(得分:1)
最佳解决方案是每隔5或10秒对服务器进行一次AJAX
调用。对于在浏览器中打开页面的每个用户,此AJAX请求将更改服务器数据库上的最后在线状态(日期时间)。
如果他离开页面,什么也不做。在这种情况下,AJAX请求将不会调用,并且上次在线时间将不会更新。
现在,您正在显示该用户已联机且已脱机的另一方。这是另一个Ajax请求(每5或10秒)从服务器提取数据,用于确定5或10秒前谁在线。根据用户过去的统计数据和当前状态,您可以确定每个用户的在线/离线状态。
希望你明白。
答案 1 :(得分:0)
另一个选项中提到的一个选项是让每个客户端以某个设置的间隔轮询服务器。然后,服务器将假定最近未轮询的任何客户端已“离开”。这种方法的一个巨大缺点是它使用了大量带宽。
另一种方法是移动决定何时向每个客户端显示消息的逻辑。当用户离开房间时,服务器以某种方式通知房间中的其他人该人已经离开。而不是客户端立即显示该消息,它可以使用setTimeout
,然后检查服务器是否已发送另一条消息,说明同一用户回到了房间。您可以在与用户关联的某个HTML块上使用data
属性来记录它可能已经离开,并且已经返回。
至于如何保持各种客户端和服务器之间的连接,我建议您研究一种名为BOSH
的技术。
wikipedia page提供了一个非常好的介绍BOSH是什么以及它为什么比其他替代方案更好,例如不断“轮询”服务器。