0

现在我的 javascript 聊天设置可以正常工作,就像

function getNewMessage()
{
     //code would go here to get new messages
     getNewMessages();
}
getNewMessages();

在函数中,我将使用 JQuery 进行获取帖子以从 php 脚本中检索消息,这将 1. 启动 SQL 连接 2. 通过 SQL 验证它是合法用户 3. 自上次用户访问后仅检索新消息 4 . 关闭 SQL

这很好用,聊天也很完美。我担心这是打开和关闭大量 SQL 连接。它非常快,但我现在想制作一个小型 javascript 多人游戏,并每秒 3 次传输用户坐标以及其他数十个变量,其中我每次打开和关闭 sql 连接并提取信息每次从众多表中提取的效率可能不足以顺利运行,并且可能对服务器造成太大压力。

有没有更好更有效的方式来传达我应该知道的所有这些变量,这些变量在我的服务器/数据库上并不难?

4

5 回答 5

2

不要使用持久连接,除非它是您唯一可用的解决方案!

当 MySQL 检测到连接已被删除时,任何临时表都会被删除,任何活动事务都会回滚,并且任何锁定的表都会被解锁。持久连接仅在 Apache 子退出时才会断开,而不是在脚本结束时断开,即使脚本崩溃也是如此!您可以在事务中间继承连接。更糟糕的是,其他请求可能会阻塞,等待这些表解锁,这可能需要很长时间。

除非您测量了连接所需的时间并将其确定为脚本运行时间的很大一部分,否则您不应考虑使用持久连接。实际上,如果您担心性能,那么您应该在这里执行此操作。查看xhprofxdebug,分析您的代码,然后开始优化。

于 2010-07-21T01:52:00.953 回答
0

如果你有高效的 SQL 语句,同时几十个玩家不会损害数据库或造成明显的延迟。您的数据库可能与您的游戏或网站托管在同一台服务器或至少同一网络上,所以不用担心。如果您的数据库碰巧托管在一个单独的服务器上,该服务器运行一个装有 MSDOS 的 8 位 16mz 板,位于偏远的亚马逊,通过无线电波连接到由醉酒猴子操作的曲柄发电机,那么您就可以了你自己的。

否则,你真的应该更担心你到底有多少数据来回传递给你的玩家。如果您要为整个世界中的所有对象来回传递坐标,则页面加载可能会花费很长时间,即使数据库查询只需要几分之一秒。这有时会在游戏中通过“战争迷雾”功能克服,该功能不会通知用户整个地图中的每个对象,只会通知玩家直接范围内的对象。这可以通过单个 SQL 查询轻松完成,其中对象坐标靠近玩家。但是,如果您有一个吝啬的主机,他们会关心连接和查询的数量。

如果您担心吸引更多玩家,请考虑探索缓存方法,例如使用fopen()fgets()fclose()等预先构建存储常用记录或值的短文件。或者,使用 php 扩展,例如apc将值存储在内存中加载到页面加载。 memcache或者memcached也采取类似的行为,但其行为方式类似于您可以连接到的单独服务器,存储可以与其他页面点击共享的值以及查询。

要在您认为缓存的页面或值可能变得陈旧时更新它们,您可以每隔一段时间运行一个 cron 作业来更新这些文件或值。如果您的主机不允许 cron 作业,请考虑让您的客人做这项工作:特定页面上的一行脚本将在一定数量的页面命中后使用来自数据库查询的新值刷新缓存。或者缓存一个日期值以检查每个页面命中,如果已经过了这么长时间,请刷新缓存。

同样,除非您受到吝啬主机的压迫,或者除非您一次获得一百或更多的页面点击量,否则您甚至无需担心您的数据库。数据库并不那么脆弱。如果他们在不止一个问题出现时歇斯底里地流泪,那么制造它的工程师将不会有很长时间的工作。

于 2010-07-21T05:34:25.127 回答
0

我知道这是一个非常烦人的“答案”,但也许你应该换一种方式来思考这个问题,毕竟这真的不是关系数据库的最强用途。您是否考虑过 XMPP 解决方案?IMO 这将是完成这项工作的最佳工具,而如今 ejabberd 和 openfire 的设置都很简单。优秀的 Strophe 库可以使前端故事变得简单,并且作为额外的奖励,您可以获得 HTTP 绑定(如 commet),因此您无需轮询服务器,您的延迟将下降并且您将产生更少的 HTTP 流量.

我知道你不太可能改变你的整个方法,就像我说过的那样,但想提供一个替代的观点。

http://www.ejabberd.im/ http://code.stanziq.com/strophe/

于 2010-07-21T10:14:59.100 回答
0

也许尝试使用不同的方法从服务器获取新消息:Comet

使用这种技术,您不必打开那么多新连接。

于 2010-07-21T00:57:32.307 回答