在PHP游戏中每分钟更新数据库

时间:2013-01-30 12:50:11

标签: php

我最近开始用PHP编程。为了锻炼,我想建立自己的PHP文本策略游戏。一个技术方面需要一些思考。

在我的游戏中,每个玩家都必须有能力获得资源,例如铁和谷物。利用这些资源,玩家可以招募士兵或建造建筑物。资源存储在一种仓库中。

资源将在一段时间内获得。例如,您每小时获得100粒粮食,粮食储存在仓库中。这意味着每0.6分钟,必须添加1粒。我一直在寻找cron的工作,但这不是我问题的最佳答案,因为它需要太多的系统资源。问题是我希望能够每分钟更新我仓库中的资源。有没有人对我的问题有所了解?

4 个答案:

答案 0 :(得分:2)

不是试图通过更新状态来解决这个问题,而是可以尝试以函数式编程方式解决它。例如。在已知条件下(例如生产开始时),编写一个可以计算资源量的函数。非常简化:

基于状态的模型:

class Gold {
  public $amount = 0;
}

class GoldDigger {
  public $amount_per_second = 1;
}

$player_gold = new Gold();
$player_worker = new GoldDigger();
while (true) {
  $player_gold->amount += $player_worker->amount_per_second;
  sleep(1);
  echo "Player has {$player_gold->amount} gold pieces\n";
}

基于功能的模型:

class Gold {
  public $workers = array();
  function getAmount() {
    $total = 0;
    foreach ($this->workers as $worker) {
      $total += $worker->getAmount();
    }
    return $total;
  }
}

class GoldDigger {
  public $amount_per_second = 1;
  public $started = 0;
  function __construct() {
    $this->started = time();
  }
  function getAmount() {
    return $this->amount_per_second * (time() - $this->started);
  }
}

$player_gold = new Gold();
$player_gold->workers[] = new GoldDigger();

while (true) {
  sleep(1);
  echo "Player has {$player_gold->getAmount()} gold pieces\n";
}

这些例子都有点人为 - 你可能会将数据存储在数据库或类似的数据库中,这会使问题复杂化,但我希望它能说明这两种策略之间的区别。

答案 1 :(得分:1)

您可能需要为此使用守护进程。查看Gearman

答案 2 :(得分:1)

您可以在用户(或其他)请求其金额时更新资源。如果您可以计算玩家在给定时间间隔内将获得多少资源,那么您可以稍后添加它们。您只需要存储上次更新的时间。

示例:

玩家在01:00看着仓库,他发现那里有50粒粮食,目前每小时收入100粒。所以他上床睡觉,第二天早上9点(8小时后)他再次检查仓库。现在他可以看到50粒+ 8小时* 100粒/小时= 850粒。

但是服务器上的数据看起来像这样:

  • 在01:01:“50粒,最后更新在01:00”
  • 05:00:“50粒,最后更新01:00”
  • 在08:59:“50粒,最后更新在01:00”
  • 在09:01:“850粒,最后更新时间为09:00”

答案 3 :(得分:0)

您可以使用缓存但更新频繁(当您有许多播放器时)可能会导致问题,而不是在服务器上消耗资源,您可以尝试存储 上次请求值的时间戳,并计算玩家从现在开始生成的“谷物”数量 (LastAccessedTimestamp-NowTimestamp)=已经过去的时间(例如,5分钟)

5分钟* 60秒= 300秒通过

300秒/ 0.6秒= 5分钟内500粒

或者您可以让客户端javascript显示仓库中有X Grains的玩家并仅在客户端更新它,每1或3min发送一次ajax请求以在没有用户活动时同步事物,或者每次用户发送操作或其他内容时都会更新。