1

我目前正在开发一个带有 PHP 后端的浏览器游戏,该后端需要在未来的特定变化点执行某些检查。Cron 作业对我来说并没有真正削减它,因为我需要秒级的精度。以下是一些背景信息:

  • 游戏是多人和回合制
  • 在创建游戏室时,游戏创建者可以指定每个操作所花费的最长时间(30 秒 - 24 小时)

一旦玩家执行一个动作,他们应该只有指定的时间来执行下一个动作,否则轮到下一个玩家。

由于显而易见的原因,我不能只通过 Javascript 来跟踪时间,因为这太容易操作了。我也不能每分钟安排一次 cron 作业,因为它可能会迟到 30 秒。

解决这个问题的最有效方法是什么?我无法想象每秒查询一个数据库会对服务器非常友好,但这是我目前倾向于的方向[1]。

任何帮助或反馈将不胜感激!

[1]:

  • 用户移动
  • 调用一个 PHP 函数,将 MySQL 表的游戏行中的“switchTurnTime”设置为“TIMESTAMP”
  • 始终在后台运行的 PHP 脚本会查询表中是否有任何“switchTurnTime”已过的游戏,切换回合并重置时间。
4

2 回答 2

0

我现在采用以下方法,因为它似乎是最容易实现和测试的,以及在不同类型的服务器/主机上部署,同时仍然可靠运行。

  • 设置一个 cron 作业以每分钟运行一个 PHP 脚本。
  • 在该脚本中,首先进行查询以查找将在这一分钟内结束时间的候选人。
  • 启动一个 while 循环,一直运行到 59 秒过去。
  • 在这个循环中,检查每个候选人的剩余时间。
  • 如果时间限制已过,请对该特定候选人进行另一次查询,以确保结束时间未更改。
  • 如果有,则在必要时将其重新添加到候选队列中。如果没有,请采取相应的行动(在我的情况下:将轮到下一位玩家)。

希望这对将来的人有所帮助,干杯!

于 2013-08-17T22:42:24.753 回答
0

您始终可以使用队列或守护程序。这仅在您具有对服务器的 shell 访问权限时才有效。

https://stackoverflow.com/a/858924/890975

每次您需要在特定时间执行某项操作时,请将其添加到队列中并延迟。我使用 beantalkd 取得了不同程度的成功。

这种方式你有很多选择。这是两个间隔为 6 秒的示例:

  • 每分钟使用一个cron作业添加10个作业,每个作业延迟6秒
  • 编写一个在后台运行的简单 PHP 脚本(守护进程),每 6 秒将一个新作业添加到队列中
于 2013-08-15T22:56:50.803 回答