[英]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谷物。
但是服务器上的数据如下所示:
您可以使用缓存,但是经常更新某些东西(当您有很多玩家时),这可能会导致问题,而不是消耗服务器上的资源,您可以尝试存储上次请求该值的时间戳并进行计算从现在开始,玩家已经产生了多少“粮食”(LastAccessedTimestamp-NowTimestamp)=经过的时间(例如5分钟)
或者您可以让客户端javascript向播放器显示仓库具有X谷物并仅在客户端上对其进行更新,如果没有用户活动,则每1或3分钟发送一次ajax请求以同步内容,否则每次更新用户发送动作或其他内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.