8

我正在开发基于 PHP/MySQL/Javascript 的在线国际象棋游戏。我遇到的一个问题是一方面用户可能只是关闭了他的浏览器。有什么方法可以可靠地检测是否有人空闲/关闭了页面?

更复杂的是,我们的学校服务器不支持 cron 作业 -_-

4

3 回答 3

2

正如其他评论者所建议的那样,唯一可靠的方法是对您的服务器使用 ping 技术。这样您就可以控制游戏,而不是浏览器。您必须“跟踪”用户的方式是触发 AJAX 调用......我认为每 5 秒通常就足够了......到服务器。所有这一切都是在“跟踪”表中插入某些内容或更新您在“游戏”表中创建的新列以跟踪用户上次进行服务器活动的时间(忽略游戏中的正常动作......你可以对正常移动执行相同的过程并重置 ping 间隔,以避免过度检查)。因此,每次用户进行移动(或其他需要服务器交互的操作)时,您都必须检查对手的时间' s 最后一次服务器活动 - 如果对手在当前时间的 7 秒内没有移动,那么对手的浏览器已经停止通信(无论出于何种原因)。我说 7 秒的原因是因为服务器/数据库通信和任何可能的网络滞后发生了额外的处理。由于网络滞后可能是瓶颈,您可能希望将此值增加到 10 左右。

于 2012-12-08T09:26:45.570 回答
1

您无法确切知道客户是否已关闭。您可以做出一些合格的猜测,但它永远不会可靠。

也许您可以找到一个您对知道客户端会话是否处于活动状态感到满意的组成部分?

一个技术含量低的解决方案是将会话 ID(或自制的唯一标识字符串)与时间戳一起保存。每当客户端发出新请求(新页面加载和/或使用 AJAX)时,更新时间戳。

由于您无法访问 cronjobs,因此您需要做出另一个妥协 - 让其他访问者告诉您客户端是否仍然处于活动状态。每当访问者加载页面时,运行存储会话 id 和时间戳的表,查看是否有任何会话看起来比您认为处于活动状态的会话更旧。

这不是对您的确切问题的反对(因为它无法完成),而是一种低技术的妥协。

于 2012-12-08T09:29:13.200 回答
0

您可以简单地在该页面上设置一个“RECURSIVE” ajax 脚本,并且该脚本会在一小段时间后静默地将更新的时间发送到服务器。在服务器上,您必须编写请求侦听器脚本来记录此详细信息。如果您看到用户的请求已停止或持续一段时间没有出现,那么他关闭了浏览器。

于 2012-12-08T09:53:05.843 回答