我正在尝试创建一个基于“ajax”的小型多人游戏。 PHP“处理程序”给出了对象的坐标。这个handler.php文件每隔200MS被轮询一次,使用ajax。
由于没有必要在没有任何事情发生时进行轮询,我想知道,如果没有频繁的轮询,有什么东西可以做同样的事情吗?例如。彗星,虽然我听说你需要为Comet配置服务器端应用程序。这是一个共享的网络服务器,所以我做不到。
如果不需要在客户端更改任何内容,可能会阻止handler.php文件甚至返回响应,这可能吗?然后,即使事情没有改变,你仍然会让客户无用地要求回复。基本上,如果需要向客户端告知某些内容,它应该只使用带宽和服务器资源,例如。改变对象的坐标。
答案 0 :(得分:11)
我不认为你可以做你正在考虑的事情并且让handler.php根本不返回任何东西并停止执行:Web服务器将保持连接打开并阻止任何进一步的轮询,直到handler.php做某事(终止或提供输出)。当它发生时,你仍在处理回应。
您可以尝试一种长轮询技术,其中您的AJAX允许非常大的超时(例如30秒),并且handler.php在没有响应之前旋转,直到它有报告的内容,然后返回。 (您需要确保旋转不是资源密集型的)。如果handler.php“过期”并且没有任何反应,请让它退出并让AJAX再次轮询。由于它每30秒才会发生一次,这将是每秒约5次的巨大改进。这将使你的投票保持在最低限度。
但这就是Comet专为此而设计的东西。
答案 1 :(得分:8)
由于Ajax只为您提供客户端服务器请求模型(通常称为pull,而不是push),因此从服务器获取数据的唯一方法是通过请求。然而,解决此问题的常用技术是服务器仅在具有新数据时才响应。因此,客户端发出请求,服务器会挂起该请求,直到发生某些事情然后回复。即使数据没有改变,也可以解决频繁轮询的需要,因为您只需要客户端在收到响应后发送新请求。
由于您使用的是PHP,因此一种简单的方法可能是让PHP代码在检查数据更改之间一次调用sleep命令200ms,然后在更改时将数据返回给客户端。
编辑:我还建议在请求时超时。因此,如果说2秒没有任何反应,则会发回“无更改”消息。这样客户端就知道服务器仍处于活动状态并处理其请求。
答案 2 :(得分:5)
由于此标记为“html5”:HTML5有<eventsource>
和WebSocket,但实施方面在实践中仍处于未来时态。
Opera实施了一个名为<eventsource>
的旧版<event-source>
。
答案 3 :(得分:4)
这是一个解决方案 - 使用SaaS彗星提供商,例如WebSync On-Demand。没有服务器资源可以担心,共享托管与否,因为它已全部卸载,您可以根据需要推出信息。
由于它是SaaS,因此它适用于任何服务器语言。对于PHP,已经有一个出版商已经准备好了。
答案 4 :(得分:1)
服务器必须参与此操作。请与托管服务提供商核实可用的模块。或者试图说服他们支持Comet。
也许您应该为此考虑一个小型虚拟专用服务器(VPS)。
答案 5 :(得分:1)
在长轮询建议中添加一件事:如果您在共享服务器上,此解决方案将具有有限的可伸缩性,因为每个活动的长轮询将保持连接(以及服务该连接的服务器端进程)活性。您的提供商很可能对您一次可以打开的连接数有限制(无论是策略定义的还是事实上的),因此如果您有比同时播放的会话/窗口更多的会话/窗口,您将遇到障碍。