我正在尝试创建一个小而基本的<!>“ajax <!>”;基于多人游戏。对象的坐标由PHP <!>“处理程序<!>”给出。这个handler.php文件每隔200MS被轮询一次,使用ajax。

由于没有必要在没有任何事情发生时进行轮询,我想知道,如果没有频繁的轮询,是否可以做同样的事情?例如。彗星,虽然我听说你需要为Comet配置服务器端应用程序。这是一个共享的网络服务器,所以我做不到。

如果不需要在客户端更改任何内容,可能会阻止handler.php文件甚至返回响应,这可能吗?然后,即使事情没有改变,你仍然会让客户无用地要求回复。基本上,如果需要向客户端告知某些内容,它应该只使用带宽和服务器资源,例如。改变对象的坐标。

有帮助吗?

解决方案

这是一个解决方案 - 使用SaaS彗星提供商,例如 WebSync On-Demand 。没有服务器资源可以担心,共享托管与否,因为它已全部卸载,您可以根据需要推出信息。

由于它是SaaS,因此它适用于任何服务器语言。对于PHP,已经有一个出版商已经准备好了。

其他提示

Comet通常用于此类事物,它可能是一个脆弱的设置,因为它不是一种特别常见的技术,因此很容易不<!>“正确。”!也就是说,现在有更多的资源可供使用,比我上次尝试〜2年前还要多。

我不认为你可以做你正在考虑的事情并且让handler.php根本不返回任何东西并停止执行:Web服务器将保持连接打开并阻止任何进一步的轮询,直到handler.php做某事(终止或提供输出)。当它发生时,你仍在处理回应。

您可以尝试一种长轮询技术,其中您的AJAX允许非常大的超时(例如30秒),并且handler.php在没有响应之前旋转,直到它有报告的内容,然后返回。 (您需要确保旋转不是资源密集型的)。如果handler.php <!>“; expires <!>”;没有任何反应,让它退出并让AJAX再次轮询。由于它每30秒才会发生一次,这将是每秒约5次的巨大改进。这将使你的投票保持在最低限度。

但这就是Comet专为此而设计的东西。

由于Ajax只为您提供客户端服务器请求模型(通常称为pull,而不是push),因此从服务器获取数据的唯一方法是通过请求。然而,解决此问题的常用技术是服务器仅在具有新数据时才响应。因此,客户端发出请求,服务器会挂起该请求,直到发生某些事情然后回复。即使数据没有发生变化,这也需要频繁轮询,因为您只需要客户端在收到响应后发送新请求。

由于您使用的是PHP,因此一种简单的方法可能是让PHP代码在检查数据更改之间一次调用sleep命令200ms,然后在更改时将数据返回给客户端。

编辑:我还建议在请求时超时。因此,如果2秒没有任何反应,则<!>“无变化<!>”;消息被发回。这样客户端就知道服务器仍处于活动状态并处理其请求。

由于标记为<!>#8220; html5 <!>#8221;:HTML5有 <eventsource> WebSocket ,但实施方面在实践中仍处于未来时态。

Opera实现了一个名为<event-source>的旧版<=>。

服务器必须参与此操作。请与托管服务提供商核实可用的模块。或者试图说服他们支持Comet。

也许您应该为此考虑一个小型虚拟专用服务器(VPS)。

在长轮询建议上添加一件事:如果您在共享服务器上,此解决方案将具有有限的可伸缩性,因为每个活动的长轮询将保持连接(以及服务该连接的服务器端进程)活性。您的提供商很可能对您一次可以打开的连接数有限制(无论是策略定义的还是事实上的),因此如果您有比同时播放的会话/窗口更多的会话/窗口,您将遇到障碍。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top