我使用PHP和JavaScript聊天进行了聊天,并且有一个断开连接按钮,用户从聊天中删除用户首先将其从用户列表中删除。但是如果用户关闭浏览器,那么他将保留在用户列表中。我如何检查他是否离开?
这必须在JS中完成而不在页面关闭处理任何句柄,因为如果用户杀死了浏览器,那么他将保持聊天状态。
顺便说一下,JS脚本总是向PHP页面发送请求,该页面不断检查循环中的新消息,当有一些时,脚本会打印出来并退出。然后它又重复了一遍。
编辑:我如何在PHP中制作一个心跳的东西?如果用户关闭页面,脚本执行将被终止,因此我们将无法检查用户是否仍在同一脚本中连接。
答案 0 :(得分:3)
抱歉,没有可靠的方法,这就是HTTP的构建方式 - 它是一种“拉”协议。 我能想到的唯一解决方案是“有效”和登录的客户端必须在很短的时间间隔内查询服务器。如果他们不这样做,他们就会退出。
答案 1 :(得分:2)
你可以每隔5秒向你的服务器发送一个小的ajax调用。没有这样做的用户不再在房间里
答案 2 :(得分:1)
您回答了自己的问题:如果您在一段时间(超过几秒钟)内没有检测到来自用户的新消息请求,那么他们就离开了房间。
HTTP的本质决定了你需要做一些AJAX类型的通信。如果你不想听“给我更多消息”请求(不确定你为什么不想要),那么建立心跳式通信。
答案 3 :(得分:0)
如果由于某种原因无法修改JS代码,那么你几乎无能为力。只有你可以使用PHP做的事情是检查是否有例如距离上次活动超过15分钟,用户已经离开。但这绝不是一个聪明的事情 - 用户可能只是坐下来观看对话15分钟。
如果您想要可靠地执行此操作,只有正确的方法是在设置的时间间隔内使用AJAX轮询。
您注意到用户经常轮询服务器以获取新邮件,您是否可以使用它来检测用户是否已离开?
答案 4 :(得分:0)
维护服务器上的活动用户列表,以及他们上次连接聊天以请求新邮件的时间。
当用户连接以检查消息时,请更新他们的时间。
每当您的代码运行时,遍历此列表并删除未连接太久的用户。
唯一的失败是,如果频道中的用户数量降至零,服务器将不会注意到有人回来。
答案 5 :(得分:0)
要解决您的编辑问题,您可以使用ignore_user_abort忽略客户端终止。
答案 6 :(得分:0)
使用javascript你可以执行以下操作:
<script type="text/javascript">
window.onunload = unloadPage;
function unloadPage()
{
alert("unload event detected!");
}
</script>
在unloadPage()函数上进行必要的ajax调用以获取PHP脚本
答案 7 :(得分:0)
使用AJAX请求一个类似这样的PHP脚本:
register_shutdown_function("disconnect_current_user");
header('Content-type: multipart/x-mixed-replace; boundary="pulse"');
while(true) {
echo "--pulse\r\n.\r\n";
sleep(2);
}
这样,您就不会经常打开/关闭连接。
答案 8 :(得分:0)
OP提出的所有问题的答案都在手册中有关连接处理的部分中进行了介绍:
http://uk3.php.net/manual/en/features.connection-handling.php
没有Ajax。
没有Javascript。
不要保持活力。
下进行。