【问题标题】:Design question server side programming in php用php设计问题服务器端编程
【发布时间】:2011-05-30 01:12:33
【问题描述】:

我正在尝试编写一个类似于围棋的多人游戏,并且想知道人们如何在服务器端进行玩家之间的通信?

由于 php(或任何其他语言)中没有任何东西可以做到这一点,我可以将每一步都写入数据库并为其他玩家读取。但这似乎很浪费,原因如下 -

  • 我不需要存储各种玩家的动作。 (除非你说服我这是绝对必要的)
  • DB 的写入量和读取量都很大(我可以将大量资源用于其他用途)
  • 现在可以将内容存储在内存中。我正在寻找快速原型。 (我知道如果我将内容存储在内存中,如果机器瞬间死机,我会为所有用户丢失整个游戏)。

因此,即使它是一个不同的用例,浏览器内聊天应用程序的作用是什么?我有一个明确的情况要写信给数据库,因为它是一个可以持续长达 10-15 分钟的游戏,但绝对不需要聊天。

还有其他我应该注意的软件吗?我可以使用 XMPP 服务器(尚未对此进行研究),但它可以与常规标准 HTTP post/get 一起使用吗?

给我一​​些网址,我会从那里进行研究。谢谢你的帮助。

  • 帕夫

【问题讨论】:

  • xmpp 可能有点矫枉过正,最后你将不得不使用某种基于服务器的存储,无论是 mysql、一些 nosql 数据库还是平面文件
  • COMET 它是您正在寻找的魔法词

标签: php mysql database web-applications xmpp


【解决方案1】:

我非常提倡 XMPP,因为它可以为您解决大部分问题。大多数 XMPP 服务器确实支持通过 HTTP 连接(通过一种类似 COMET 的技术,称为 BOSH),至少有两个纯 JavaScript 库允许直接从浏览器进行连接:Strophe.jsJSJaC

通常由于路由时间短,XMPP 服务器仅将消息保存在内存中,因此不会将它们写入数据库。大多数服务器都支持插件,以便将系统更改为例如以后可以透明地记录移动或将消息存储到数据库中。

Strophe.js 的一位作者写了一本书,其中有一章是关于编写一个简单的两人游戏(实际上是井字游戏),所以如果你走这条路,你可能想check that out

【讨论】:

    【解决方案2】:

    我使用 Memcached 来做这种事情。它非常快并且不存储所有动作(只需覆盖玩家的键)。它会让你的事情变得轻松愉快。

    PECL 中有两个 PHP Memcached 库(MemecacheMemcached)。两者都做得很好。

    【讨论】:

      【解决方案3】:

      许多聊天都使用平面文件。平面文件也可能是您的正确选择。就像 Memcached 的一些非正统用法一样。游戏本质上是短暂的。所以做 PHP 为 Session 做的事情可能是一个很好的方式来设计你的系统。

      祝你好运!

      【讨论】:

      • 我猜平面文件是一种方法。我也在考虑 Memcached,但担心它可能会花费太多的工程时间用于研究(尽管我喜欢它)。我想确认我没有遗漏其他游戏开发者已经使用的一些软件。
      • 不是真的... PHP 中的游戏服务器并不是一个标准。游戏需要持久性,而 php 不这样做。
      【解决方案4】:

      我从未听说过那个游戏,但例如像 Ogame 这样的网页游戏使用数据库来存储动作和内容。其他人使用平面文件,但这对我来说似乎不是很好,因为我听到了很多关于安全问题的信息。可以肯定,设计良好的数据库应用程序比任何其他工具都安全得多。真正的问题是另一个:php 不是为游戏而设计的,而且可能永远不会。

      【讨论】:

        【解决方案5】:

        如果 HTML 5 已启动并正在运行,您可能需要为此使用与服务器的套接字连接(您目前已经可以使用 Flash 进行此操作)。基本上,您将始终在您的服务器上运行一个守护程序脚本,该脚本将侦听某个套接字,并保留已连接用户的列表,然后当从一个已连接用户向套接字服务器发送消息时,套接字服务器将解析消息,并将其转发给正确的连接用户。这样就不需要将太大的东西存储在内存中。它将接收并立即发送回消息。

        客户端基本上会创建一个到套接字服务器的持久连接,并有一个处理程序来接收服务器守护程序发回的消息。服务器守护进程可以是 PHP 通过命令行运行的(这样它就一直在运行并且不会超时)。您可能想为您的服务器创建一个在启动时运行 PHP 守护程序脚本的 init shell 脚本。您还需要从 PHP 脚本访问套接字(大多数共享服务器不允许这样做),这意味着您可能需要 VPS(虚拟专用服务器)。

        这是 HTML5 将带给我们的东西,但目前最好的方法是使用 Flash 代替(或使用效率较低但不是真正异步的方法之一)。这是一个很大的话题,所以我不能说太多细节,但我至少可以为你指出正确的方向。互联网上的某个地方可能有这样的例子。

        【讨论】:

        • 另一件需要考虑的事情可能在这里:en.wikipedia.org/wiki/Comet_%28programming%29 - 这使用页面加载从未真正完成的方法,因此服务器可以继续向用户发送更多数据而无需轮询。当然,它也有其局限性。
        • 这太好了,因为我的背景是系统编程 (C),所以我正在考虑这样的事情。但理想情况下,我想要使用标准 http 协议的东西,因为大多数平台都支持它。我想将 HTML5 中的游戏移植到 FB、iPhone 和 Android 平台,因此拥有游戏逻辑的 http 接口很重要
        • 顺便说一句,现在使用 HTML5 Web 套接字还不是一个好主意:Mozilla 宣布由于安全问题,它们将在 FF4 中默认启用它们。他们很可能会在下一个版本中发布,但这需要几个月的时间。
        猜你喜欢
        • 2014-03-01
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多