【发布时间】:2015-07-05 17:28:17
【问题描述】:
我正在创建一个游戏,其中用户正在移动主要对象(左/右/上/下)。每次他移动它时,他都会向服务器发出请求,因此 PHP 会将玩家的位置放置到地图上。
游戏太快了,用户应该每秒移动2-3次,在196-200请求后我通常会出错,大约3-5分钟无法连接到服务器,这不是不错。
考虑到我可以完全访问控制面板并且无法更改请求频率,我该如何解决这个问题?
【问题讨论】:
我正在创建一个游戏,其中用户正在移动主要对象(左/右/上/下)。每次他移动它时,他都会向服务器发出请求,因此 PHP 会将玩家的位置放置到地图上。
游戏太快了,用户应该每秒移动2-3次,在196-200请求后我通常会出错,大约3-5分钟无法连接到服务器,这不是不错。
考虑到我可以完全访问控制面板并且无法更改请求频率,我该如何解决这个问题?
【问题讨论】:
有时您的 HTTP 服务器或防火墙会阻止这些请求以防止 DDoS 攻击。
要解决这个问题,您可以使用 Websocket (https://en.wikipedia.org/wiki/WebSocket) 代替 ajax 调用。
对于每个 ajax 调用,浏览器都会执行以下步骤:
请求 1:
- Open Connection
- Do Request
- Get Any Response
- Close Connection
请求 2:
- Open Connection
- Do Request
- Get Any Response
- Close Connection
但是如果你使用 websockets 你可以:
- Open Connection
- Do Request
- Do Request
- Do Request
- Do Request
- Do Request
- Do Request
- Get Any Response
- Do Request
- Do Request
- Do Request
- (...)
并且关闭步骤只会在你更改页面、关闭浏览器或通过API强制关闭Websocket连接时执行。
该解决方案专为这些场景而创建,并且有一些 HTML 游戏引擎使用该解决方案用于多人游戏(例如 http://www.isogenicengine.com/)
对于 PHP,您可以使用 Ratchet (http://socketo.me/) 或 PHP-websockets (https://github.com/ghedipunk/PHP-Websockets) 实现。
希望对你有帮助
【讨论】: