繁体   English   中英

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

[英]Updating database every minute in PHP game

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

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

资源将在一段时间内获得。 例如,您每小时获得100谷物,该谷物存储在仓库中。 这意味着每0.6分钟必须添加1粒谷物。 我一直在寻找工作的机会,但这并不是解决我的问题的最佳方法,因为这会占用过多的系统资源。 问题是我希望能够每分钟更新仓库中的资源。 有谁知道我的问题吗?

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

基于状态的模型:

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";
}

这两个示例都有些人为-您可能会将数据存储在数据库或类似数据库中,这使事情复杂化了一些,但我希望它能说明这两种策略之间的差异。

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

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

例:

玩家在01:00看着仓库,发现那里有50粒谷物,当前收入为每小时100粒谷物。 因此,他上床睡觉,第二天早上09:00(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”

您可以使用缓存,但是经常更新某些东西(当您有很多玩家时),这可能会导致问题,而不是消耗服务器上的资源,您可以尝试存储上次请求该值的时间戳并进行计算从现在开始,玩家已经产生了多少“粮食”(LastAccessedTimestamp-NowTimestamp)=经过的时间(例如5分钟)

5分钟* 60秒=经过300秒

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

或者您可以让客户端javascript向播放器显示仓库具有X谷物并仅在客户端上对其进行更新,如果没有用户活动,则每1或3分钟发送一次ajax请求以同步内容,否则每次更新用户发送动作或其他内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM