有啥方法可以检查是不是有人使用 Javascript/PHP 关闭了浏览器? [关闭]
Posted
技术标签:
【中文标题】有啥方法可以检查是不是有人使用 Javascript/PHP 关闭了浏览器? [关闭]【英文标题】:Any way to check if someone has closed their browser using Javascript/PHP? [closed]有什么方法可以检查是否有人使用 Javascript/PHP 关闭了浏览器? [关闭] 【发布时间】:2012-11-26 09:21:11 【问题描述】:我正在开发基于 php/mysql/javascript 的在线国际象棋游戏。我遇到的一个问题是一方面用户可能只是关闭了他的浏览器。有什么方法可以可靠地检测是否有人空闲/关闭了页面?
作为一个额外的复杂因素,我们的学校服务器不支持 cron 作业 -_-
【问题讨论】:
简短回答:否但您仍然可以定期 ping 用户进行检查 请记住,这依赖于用户允许继续进行 ping ping 用户是什么意思? 您使用xhr 每X
秒从浏览器向服务器发送一个请求。
@DavidTitarenco ,不,它是 NOT
【参考方案1】:
正如其他评论者所建议的那样,唯一可靠的方法是对您的服务器使用 ping 技术。这样您就可以控制游戏,而不是浏览器。您必须“跟踪”用户的方式是触发 AJAX 调用......我认为每 5 秒通常就足够了......到服务器。所有这一切都是在“跟踪”表中插入某些内容或更新您在“游戏”表中创建的新列以跟踪用户上次进行服务器活动的时间(忽略游戏中的正常动作......你可以对正常移动执行相同的过程并重置 ping 间隔,以避免过度检查)。因此,每次用户进行移动(或其他需要服务器交互的操作)时,您都必须检查对手上次服务器活动的时间 - 如果对手在 7 秒内没有移动当前时间,则对方的浏览器已停止通信(无论出于何种原因)。我说 7 秒的原因是因为服务器/数据库通信和任何可能的网络滞后发生了额外的处理。由于网络滞后可能是瓶颈,您可能希望将此值增加到 10 左右。
【讨论】:
感谢您的合理回复!我没想到会在 SO 上发生这么多争吵-_- 现在,对于一个单独的问题:此解决方案取决于一个活跃的用户。我有一个显示所有可用游戏的大厅。服务器有什么办法可以确定两个玩家是否都离开了,这样我就不必再在我的大厅里展示那个游戏了?这里缺少 cron 成为一个问题。 这是我不同意您在多人游戏中简单地使用 AJAX 的方法的地方。这真的应该用 websockets 来完成,你不需要轮询和类似的东西。 Cronjobs 真的无济于事(除非您的大厅页面也使用轮询,但这使得它们变得不必要),因为服务器无法向客户端发送消息。就像游戏中的 AJAX 轮询解决方案一样,您必须在大厅中执行类似的操作。大厅页面必须像以前一样每 5 秒轮询一次,并检查两个用户在过去 7 秒内是否没有活动【参考方案2】:您无法确切知道客户端是否已关闭。你可以做出一些合格的猜测,但它永远不会可靠。
也许您可以找到一个您对知道客户端会话是否处于活动状态感到满意的组成部分?
一种技术含量较低的解决方案是将会话 ID(或自制的唯一标识字符串)与时间戳一起保存。 每当客户端发出新请求(新页面加载和/或使用 AJAX)时,更新时间戳。
由于您无法访问 cronjobs,因此您需要做出另一个妥协 - 让其他访问者告诉您客户端是否仍然处于活动状态。 每当访问者加载页面时,遍历存储会话 ID 和时间戳的表,查看是否有任何会话看起来比您认为的活跃会话更旧。
这不是对您的确切问题的反对(因为它无法完成),而是一种低技术的妥协。
【讨论】:
【参考方案3】:您可以简单地在该页面上设置一个 'RECURSIVE' ajax 脚本,该脚本会在一小段时间后静默地向服务器发送更新的时间。在服务器上,您必须编写请求侦听器脚本来记录此详细信息。如果您看到用户的请求被停止或最近一段时间没有出现,那么他关闭了他的浏览器。
【讨论】:
以上是关于有啥方法可以检查是不是有人使用 Javascript/PHP 关闭了浏览器? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
我的 discord.py 机器人有啥方法可以检查用户是不是具有使用命令的特定权限?