Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 网络游戏并发控制_Php_Database_Web Applications_Concurrency - Fatal编程技术网

Php 网络游戏并发控制

Php 网络游戏并发控制,php,database,web-applications,concurrency,Php,Database,Web Applications,Concurrency,还有一些关于并发性的其他问题,但它们并没有完全解决我的场景 让我们假设我有一个游戏,在这个游戏中,用户彼此互动,打架等等。在任何给定的时间,一个玩家都可能与其他玩家进行多次互动,所有玩家都可以看到事件的发生。当这些玩家中的任何一个访问该站点时,它需要更新所涉及的任何数据,并将其显示给用户 示例场景:玩家A和玩家B在战斗,在这场战斗中每隔几分钟就会发生一次事件。同时,玩家A也在与玩家C互动。由于愚蠢的运气,两次互动的事件恰好在同一秒发生 当第二个到达时,由于再次愚蠢的运气,玩家B和玩家C同时访问该

还有一些关于并发性的其他问题,但它们并没有完全解决我的场景

让我们假设我有一个游戏,在这个游戏中,用户彼此互动,打架等等。在任何给定的时间,一个玩家都可能与其他玩家进行多次互动,所有玩家都可以看到事件的发生。当这些玩家中的任何一个访问该站点时,它需要更新所涉及的任何数据,并将其显示给用户

示例场景:玩家A和玩家B在战斗,在这场战斗中每隔几分钟就会发生一次事件。同时,玩家A也在与玩家C互动。由于愚蠢的运气,两次互动的事件恰好在同一秒发生

当第二个到达时,由于再次愚蠢的运气,玩家B和玩家C同时访问该站点,以检查他们与玩家A的战斗状态。战斗需要更新关于玩家A的信息。如果我没有正确编码,A的数据可能会混乱

在这种情况下,我有两个游戏,每个游戏都有不同的解决方案和不同的问题。其中一个使用锁,因此当用户访问站点时,他们会在db行上获取锁,读取成功获取的锁的数据,然后写入更改并释放锁。但有时,由于未知的原因,这会失败,锁会永远卡住,用户抱怨,我们不得不手动修复它。我的另一个游戏使用守护进程来执行这些事务,这使得问题(几乎)没有意义,因为只有一个进程进行了这些更改。但玩家仍然可以在同一时间做其他事情,并可能导致同样的问题

我读过一些关于这方面的不同解决方案,比如乐观或基于时间戳的控制。我想问:

  • 以下哪一项最常用于像我这样的情况,哪一项最容易实现

  • 我的下一个项目是使用Kohana(PHP)及其ORM,因此默认情况下,我的db写入将采用“只覆盖所有这些字段”的形式。我需要为此编写自己的更新查询,还是可以获得与ORM兼容的解决方案

  • 那么涉及多个表的事务呢?战斗的结果必须改变战斗表和玩家信息表,可能还有更多的事情。在这里,哪些解决方案更容易使用?我的所有表都需要事务时间戳列吗

  • 很多这样的解决方案都说,当发生冲突时,要么重试,要么忽略。这对我意味着什么?“重试”是否意味着重新启动整个脚本,这会给用户带来额外的加载时间?我不认为ignore是一个有效的选项,因为事件必须在某个时刻执行。在我发现的其他问题中,向用户呈现冲突错误通常是一个有效的选择——对我来说,不是

  • 并发控制对性能的影响是什么?它值得吗


  • 我认为你所寻找的已经包含在你的问题中:交易。 如果您使用的是MySQL,则需要使用innoDb引擎设置表,以便能够使用事务。一些文件:


    如果可以的话,不要尝试重新发明轮子。

    但是,在我读取要修改的数据后,其他人不能在我进行计算时修改数据吗?在提交事务之前,我必须手动验证数据是否未被更改,但验证和提交本身并不是原子的。或者我的查询应该是“更新,其中所有数据都是我期望的”,如果我得到0行受影响的数据,我知道我需要重试?啊-选择更新。第二次也是如此。我必须修改ORM中的一些内容。对于问题4-我不需要重试,因为它将始终读取最新数据?问题是,由于php的单请求操作模式,用户可能会看到一些东西(第一个请求),并在另一个用户完成其他事情后进行操作。但他们通常知道这是可能发生的(这就是为什么在某些游戏中,你会让大F5用户几乎实时地检查正在发生的事情:p),但只要你在任何计算之前启动一个事务,并在最后提交或回滚这些事务,如果你在执行操作之前检查是否满足了执行某些操作的条件,你就不会有问题。