实时策略游戏在PHP中是如何工作的?

实时策略游戏在PHP中是如何工作的?,php,database,mmo,Php,Database,Mmo,一些MMO实时策略游戏,如Travian或oGame,都是用PHP编写的 你能简单地解释一下这种游戏是如何在幕后运作的吗?游戏如何在没有玩家请求的情况下进行实时数据库更新 此外,当运行RTS游戏(如Travian)时,有1000名活跃玩家时,您需要什么样的服务器负载/带宽?更新很可能由cron jobs完成,或者另一种可能是他们在登录/任何页面更改时完成。带宽可能会有很大的变化,这取决于活跃用户的数量、可能性等。我认为您应该在localhost/test hist上用示例请求来衡量带宽,因为它在

一些MMO实时策略游戏,如Travian或oGame,都是用PHP编写的

你能简单地解释一下这种游戏是如何在幕后运作的吗?游戏如何在没有玩家请求的情况下进行实时数据库更新


此外,当运行RTS游戏(如Travian)时,有1000名活跃玩家时,您需要什么样的服务器负载/带宽?

更新很可能由cron jobs完成,或者另一种可能是他们在登录/任何页面更改时完成。带宽可能会有很大的变化,这取决于活跃用户的数量、可能性等。我认为您应该在localhost/test hist上用示例请求来衡量带宽,因为它在很大程度上取决于项目


此外,如果有相当多的玩家等,我会考虑不使用PHP+MySQL,而是使用Python和PostgreSQL,甚至Java或其他系统进行编码。

通常有两部分:web界面和后台守护进程(通常称为“事件处理程序”)

webinterface做了所有的只读和无害的事情,其中竞争条件根本不是问题——密码更改、重命名等等

更重要的事情,如建造单位或与其他玩家战斗,会提交给事件处理程序,在那里检查、验证并存储,直到达到执行时间。在这里执行检查而不是在webinterface中执行检查的好处是,您可以完全消除比赛条件的风险(例如在一个星球上发射包含所有单位的飞船,同时建造一些昂贵的东西,这基本上会导致复制玩家的可用单位)只要确保在给定时间内只运行一个操作/事件(例如,无多线程、多处理等)

如果您的不是完全实时的,而是使用“滴答声”(例如,操作仅每x分钟发生一次),那么您当然可以使用cronjob而不是后台守护进程,但是您需要使用其他方法来避免竞争条件


在我自己的游戏中,我有一个后台守护进程,它有一个类似RPC的接口,因此在webinterface中,我只需调用一个函数
syncCall('someFunction',…)
然后通过套接字连接到后台守护进程并执行给定函数,返回该函数返回的任何内容


然而,如果我现在写一个新游戏,我肯定会使用一个异步解决方案,比如node.js或一个异步python框架。它不需要有两个不同的部分,但对于某些部分,您必须注意锁定,因为每当您从节点本身调用的函数之一返回时,可能会执行来自另一个事件的回调。

即使这个主题已经很老了,但我确实认为我仍然有一个“更好的”(如果我自己可以这么说的话)回答你的问题,然后是含糊不清的“更新由cronjobs完成”回答

Travian i.e.通过使用javascript让您产生实时的错觉。后面实际发生的情况如下:

播放器A向播放器B发送一个攻击。在MySQL数据库中,这会被记录为到达的时间戳。每次玩家A更改或刷新页面时,都会启动一个脚本(通过使用include),检查与该玩家有关的任何活动(援军到达、攻击到达目标等)。脚本显然会检查当前时间,并查看时间戳小于当前时间戳的所有活动。这意味着应该采取行动。就在那一刻,动作实际上得到了处理


这也意味着如果玩家A和玩家B都没有再次登录,那么攻击将永远不会被计算,除非其他人也攻击玩家B-那么玩家B和攻击玩家的所有活动都将被处理。

我想我会使用iFrame和javascript来更新它们。比如1个隐藏的info-iFrame和qui/output-iFrames,谁的url指向php,并且一直在更新

正如用户1842120所说:特拉维亚实时是一种幻觉

我将简单地解释“实时”在网络游戏中是如何工作的

假设有3名玩家,其中2人在线..,P1攻击P3,当重新加载页面或更改页面时,脚本将被激活,P3将被攻击

P3处于脱机状态,他看不到攻击,但攻击正在发生。当P3联机时,P3看到他/她的村庄受到攻击,简单地说:


您只需要一个客户端(页面上的在线用户/浏览器)即可运行游戏

我不会用PHP编写代码,即使它可以做到。我会用NodeJS来编写这个代码。好吧,这就是我的想法,但是特拉维安和奥加梅非常“有名”,他们是PHP。我不是说这是正确的方法,但它似乎是可行的。OGame是多年前由一个普通的私人开发人员作为一个爱好项目编写的(相信我,你不想看到任何真正古老的OGame代码,希望现在已经被取代)。此时,node.js甚至不存在,python在web应用程序中也没有真正普及。因此,除非你想使用Perl、Java或ASP,否则PHP几乎是唯一的解决方案。@AlienWebguy如果你想做像Travian?Cron这样的工作,你能告诉我为什么你更喜欢
NodeJS
而不是
PHP
?这是否意味着他们必须每秒钟做一次cron?因为它实际上是实时的。即使你不在线,其他玩家也会实时看到其他玩家的行为结果。我认为这些都是半实时的,也许他们每分钟都会这样做。好吧,一旦你对其他人的攻击“命中”,你就可以看到结果,所以它必须存储在数据库的某个地方,并且立即,对吗?而且人们可以在攻击之前从一个帐户向另一个帐户发送部队,所以必须是实时的,或者至少他们的后端必须每秒钟检查一次更改,甚至更多。我说得对吗?我