【问题标题】:Update database when user is no more online当用户不再在线时更新数据库
【发布时间】:2019-03-10 16:04:03
【问题描述】:

我目前正在开发一款 Javascript 多人游戏。

当用户想玩时,他们会进入等候室等待玩家一起玩。

它以这种方式存储在 SQL 数据库中: 我有一个名为 USER 的表,其中包含一些关于玩家的数据,还有一个名为 WAITINGROOM 的表,它将等待游戏的用户的 ID USERID 与其他信息相关联。

当玩家离开等候室或关闭浏览器时,我会删除表WAITINGROOM中带有他们id的行。

但是让我们假设用户在寻找游戏时失去了互联网连接。我怎么知道他离线,所以我可以删除包含他的 id 的行?

播放器离线,所以绝对不是客户端我可以处理这个问题。 也许是 PHP 的服务器端?或者直接在数据库中使用超时或其他东西......

【问题讨论】:

  • 我想你可以使用一个函数来检查等候室的用户是否在线。然后使用 cron-job 运行该函数,例如每 1 分钟运行一次。
  • 检查用户是否在线的功能是我的问题,因为我无法向他们发送或接收数据。
  • 看看这个,我认为它可能会有所帮助daniweb.com/programming/web-development/threads/254730/…

标签: php mysql online-game


【解决方案1】:

我假设您有一个脚本(可能通过 ajax 调用)来获取当前用户的在线用户。只需添加一个带有时间戳的列,如“last_seen_online”。每次用户调用此脚本时更新该字段。现在您可以在 sql 中对其进行过滤,例如获取最后一分钟在线的所有用户。 - 自一分钟以来未激活的所有内容都被视为离线。

要摆脱掉线的用户,您可以实现垃圾收集(就像 php 与会话一样)。您抓取自最后(例如)5 分钟以来未见过的所有用户。您将此垃圾收集放在同一个脚本中。为了保持低负载。您不会每次都调用它,就像 50% 的时间使用 if(rand(1,100) > 50) 或任何您喜欢的百分比一样。

【讨论】:

  • 我确实使用 ajax 来获取在线玩家。我会使用你的解决方案。我想知道在我的 SQL 表中摆脱离线用户的最佳方法是什么...我可以在 JS 中使用您的解决方案,但也许我也可以在 SQL 中使用更新触发器来实现它?
  • 垃圾收集然后使用类似这样的 SQL:DELETE FROM users WHERE (UNIX_TIMESTAMP()-300) > YOUR_LAST_ONLINE_TIMESTAMP 300 5 分钟 (60*5)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 2019-06-21
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多