现在,我的javascript聊天设置正常运行,就像
一样function getNewMessage()
{
//code would go here to get new messages
getNewMessages();
}
getNewMessages();
在函数中我会使用JQuery来发送一个get post来检索来自php脚本的消息 1.启动SQL连接 2.通过SQL验证它是合法用户 3.自上次用户访问以来仅检索新消息 4.关闭SQL
这很有效,聊天效果很好。我担心的是这会打开和关闭很多SQL连接。这是非常快的,但我现在想制作一个小的javascript多人游戏,并且每次传输用户坐标以及其他数十个变量,每次打开和关闭sql连接并提取信息从众多的表中,每次都可能没有足够的效率来运行,也可能在服务器上承受太大的压力。
有没有更好的方式来传达我应该知道的所有这些变量,哪些变量在我的服务器/数据库上并不那么难?
答案 0 :(得分:2)
不要使用持久连接,除非它是唯一可用的解决方案!
当MySQL检测到连接已被删除时,将删除所有临时表,回滚任何活动事务,并解锁所有锁定表。持久连接仅在Apache子项退出时丢弃,而不是在脚本结束时删除,即使脚本崩溃!您可以在事务中继承连接。更糟糕的是,其他请求可能会阻塞,等待这些表解锁,这可能需要相当长的时间。
除非您已经测量了连接所需的时间并将其确定为脚本运行时间的很大一部分,否则不应考虑使用持久连接。事实上,如果你担心表现,这应该是你在这里做的。查看xhprof或xdebug,分析您的代码,然后开始优化。
答案 1 :(得分:0)
也许尝试使用不同的方法从服务器获取新消息:Comet。
使用这种技术,您不必打开那么多新连接。
答案 2 :(得分:0)
答案 3 :(得分:0)
如果你有高效的SQL语句,几十个玩家同时不会伤害数据库或造成明显的延迟。可能您的数据库将托管在与您的游戏或网站相同的服务器或至少相同的网络上,因此不必担心。如果您的数据库恰好托管在一个运行8位16mz电路板的单独服务器上,该电路板装有MSDOS,位于远程亚马逊,通过无线电波连接到由醉猴操作的曲柄驱动的发电机连接,您就在你自己就是这个。
否则,你真的应该更加担心你向玩家传递的数据到底有多少。如果你在整个世界中传递所有对象的来回坐标,那么页面加载可能会花费很长时间,即使数据库查询只需要几分之一秒。这有时在游戏中通过“战争迷雾”特征克服,该特征不打扰通知用户整个地图中的每个单个对象,只有那些在玩家的直接范围内的对象。这可以通过单个SQL查询轻松完成,其中对象坐标靠近玩家。但是,如果你有一个吝啬的主机,他们会关心连接和查询的数量。
如果您担心会吸引更多玩家,请考虑使用fopen()
,fgets()
,fclose()
来探索缓存方法,例如预先构建存储常用记录或值的短文件或者,使用像apc
这样的php扩展来将值存储在内存中,这些值从页面加载到页面加载持续存在。 memcache
或memcached
的行为也类似,但其作用类似于您可以连接的单独服务器,存储可与其他网页匹配共享的值,以及查询。
要在您认为缓存的页面或值可能过时时更新它们,您可以经常运行一个cron作业来更新这些文件或值。如果您的主机不允许cron作业,请考虑让您的客户执行该工作:某个页面上的一行脚本将在一定数量的页面点击后使用数据库查询中的新值刷新缓存。或者缓存日期值以在每次点击时检查,如果已经过了这么多时间,请刷新缓存。
再说一次,除非你是一个吝啬的主人的压迫性拇指,或者除非你一次获得一百或更多的页面点击,否则甚至不必担心你的数据库。数据库并不脆弱。如果他们在任何时候出现不止一个问题,他们都会歇斯底里地崩溃,那么制造它的工程师就不会有很长时间的工作。
答案 4 :(得分:0)
我知道这是一个非常恼人的“答案”,但也许您应该以不同的方式思考这一点,毕竟这不是关系数据库最强大的用法。您考虑过XMPP解决方案吗? IMO这将是这项工作的最佳工具,ejabberd和openfire这些日子都是微不足道的。优秀的Strophe库可以使前端故事变得简单,并且作为额外的奖励,您可以获得HTTP绑定(如commet),因此您不需要轮询服务器,您的延迟会下降,您将产生更少的HTTP流量
我知道你不太可能改变你的整个方法,只是因为我这么说,但是想提供另一种观点。