1

我正在用 jQuery 和 PHP 构建一个“多人游戏世界”。这是它的工作原理:

  1. 用户角色的位置取自数据库,相应地绘制用户(位置值是 CSS 值 - 左和上)

  2. 用户可以使用键盘上的箭头键移动,使用 jQuery 动画使他们的角色移动。当这种情况发生时(每次按下箭头),用户的位置值被插入数据库并更新。

  3. 如您所说,为了使这个“全局”(以便用户互相看到),需要为使用 AJAX 的每个用户一次更新所有值

我遇到的问题是我需要不断调用我编写的连接到 MySQL 服务器并从数据库表中获取值的 JavaScript 函数。这个函数需要通过不断调用,setInterval(thisFunction, 1000);但是我的主机只是因为服务器资源过载而暂停了我,我认为这是因为我所有的 MySQL 查询。即使在反复从我的数据库中获取值之后,我也必须每隔几秒插入一次值,所以我可以想象如果有足够多的客户端登录,随着时间的推移会导致崩溃。如何减少我正在使用的查询量?还有另一种方法可以做我需要做的事情吗?谢谢你。

4

6 回答 6

2

在资源使用方面,这与聊天系统本质上是一样的。尝试搜索,您会发现许多不同的解决方案,包括长轮询memcached等概念。例如,检查这个线程:Scaling a chat app - short polling vs. long polling (AJAX, PHP)

于 2011-04-27T15:53:35.037 回答
0

结帐龙卷风

从他们的网站:

Tornado 是可扩展、非阻塞的 Web 服务器和工具的开源版本,为 FriendFeed 提供支持。FriendFeed 应用程序是使用一个看起来有点像 web.py 或 Google 的 webapp 的 Web 框架编写的,但带有额外的工具和优化以利用底层的非阻塞基础设施。

该框架与大多数主流 Web 服务器框架(当然还有大多数 Python 框架)不同,因为它是非阻塞的并且相当快。因为它是非阻塞的并且使用 epoll,它可以同时处理数千个站立连接,这意味着它非常适合实时 Web 服务。我们专门构建了 Web 服务器来处理 FriendFeed 的实时功能——FriendFeed 的每个活跃用户都与 FriendFeed 服务器保持开放连接。(有关扩展服务器以支持数千个客户端的更多信息,请参阅 C10K 问题。)

于 2011-04-27T15:59:48.660 回答
0

您应该查看长轮询 - http://en.wikipedia.org/wiki/Push_technology。此方法允许您与服务器建立连接,然后仅在需要时更新它。但是,听上去,如果您想每次都进行更新,那么您的工作量非常大,您可能想研究另一种存储这些数据的方式,但是如果您想知道大公司是如何做到的,他们往往有大量的服务器来为他们处理它,但他们也会使用类似于长轮询的技术。

于 2011-04-27T15:55:26.143 回答
0

您可以使用memcachedSee http://php.net/manual/fr/book.memcached.php将所有位置存储在内存中,并每隔几秒钟将它们全部保存到数据库中(如果需要)。

于 2011-04-27T15:56:30.007 回答
0

您可以使用网络套接字来解决这个问题。看看这个nettuts 教程

于 2011-04-27T15:57:41.620 回答
0

还有另一种方法,它是模拟或使用实际的套接字。您可以通过目前在 Chrome 中工作的WebSockets推送数据,而不是不断提取数据(刷新以检查是否有新记录)(至少据我所知,在 FF4 中没有尝试过),或者您可以使用Node.js用于更精简的长池化。这样,玩家之间的通信将是双向的,而不需要 MySQL 来存储位置。

于 2011-04-27T15:58:43.733 回答