【问题标题】:Is there a more efficient way to update a JSON file?有没有更有效的方法来更新 JSON 文件?
【发布时间】:2019-06-25 12:26:52
【问题描述】:

我正在开发一个基于浏览器的游戏,对于战斗实例,我需要能够跟踪玩家的生命值以及 NPC 的生命值。我正在考虑为每个实例设置一个 JSON 文件更有意义,然后让一个 mySQL 数据库不断受到请求的影响。我已经成功地创建了 JSON 文件、提取内容、更新相关变量,然后覆盖该文件,但我想知道是否有比我设置它的方式更有效的方法来处理它。

$new_data = array(
    "id"=>"$id",
    "master_id"=>"$master_id",
    "leader"=>"$leader",
    "group"=>"$group",
    "ship_1"=>"$ship_1",
    "ship_2"=>"$ship_2",
    "ship_3"=>"$ship_3",
    "date_start"=>"$date_start",
    "date_end"=>"$date_end",
    "public_private"=>"$public_private",
    "passcode"=>"$passcode",
    "npc_1"=>"$npc_1",
    "npc_1_armor"=>"$npc_1_armor",
    "npc_1_shields"=>"$npc_1_shields",
    "npc_2"=>"$npc_2",
    "npc_2_armor"=>"$npc_2_armor",
    "npc_2_shields"=>"$npc_2_shields",
    "npc_3"=>"$npc_3",
    "npc_3_armor"=>"$npc_3_armor",
    "npc_3_shields"=>"$npc_3_shields",
    "npc_4"=>"$npc_4",
    "npc_4_armor"=>"$npc_4_armor",
    "npc_4_shields"=>"$npc_4_shields",
    "npc_5"=>"$npc_5",
    "npc_5_armor"=>"$npc_5_armor",
    "npc_5_shields"=>"$npc_5_shields",
    "ship_turn"=>"$ship_turn",
    "status"=>"$status");

$new_data = json_encode($new_data);
$file = "$id.json";
file_put_contents($file, $new_data);

它有效,但我想知道是否有一种方法可以更新单个数组项,而无需提取所有数据,将其分配给 vars,然后重新写入文件。在这个例子中,我只改变了一个 var (ship_turn)

【问题讨论】:

  • “我认为为每个实例设置一个 JSON 文件比让 mySQL 数据库不断受到请求的影响更有意义。” ...为什么?跨度>
  • 数据库服务器被设计用于处理请求,并具有各种有用的功能,以防止同时更新多个内容时出现竞争条件。
  • 这就是数据库的目的,被请求锤击
  • @CD001 – 每个用户每隔几秒就会查询一次数据库,看看是否轮到他们,并更新生命值。我担心如果我每隔几秒就有 1000 名玩家读/写数据库,那可能会导致问题。没有?
  • @JonWenzel - 与尝试使用文本 (json) 文件执行类似操作相比,它会导致更少的问题;)

标签: php json


【解决方案1】:

我认为为每个实例设置一个 JSON 文件比让 mySQL 数据库不断受到请求的影响更有意义。

MySQL 已针对此任务进行了优化。

如果您使用文件(如 JSON)作为数据库替换,那么您必须处理“竞争条件”,因为文件访问未针对并发读/写访问进行优化(默认情况下)。

如果您处于高并发环境中,则应避免将文件系统用作“数据库”。文件系统上的多个操作很难在 PHP 中实现原子化。

更多详情请见flock

【讨论】:

  • 太棒了,谢谢。我很欣赏你的回应。这非常有帮助。
【解决方案2】:

这取决于游戏。对于回合制游戏或任何非实时游戏,MySQL 方法应该没问题。毕竟,数据库的设计目的是为了得到沉重的打击 :-) 对于实时游戏,我会选择 WebSocketNodeJS 作为后端。服务器将保持游戏的运行时状态,对客户端请求做出适当反应并处理竞争条件(就像您在独立的多人服务器上所做的那样)

【讨论】:

  • 酷,谢谢。它是回合制的,但我想如果有很多用户,我担心每 1 秒查询一次数据库以获取更新。 WebSockets 看起来很有趣,但遗憾的是,这有点超出了我的编码能力。
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多