我有一个简单的网络应用程序,其中列出了一组私人人员和他们发布的最后一条消息。
我目前只是通过使用 Ajax 每 30 秒访问一个 php 脚本进行轮询,该脚本获取所有人员和最新消息,然后以 JSON 形式返回。我解析并更新 DOM。
由于大部分时间效率不高,没有任何变化,但它仍然每 30 秒获取所有数据。
有什么基本的我可以做的,只是用代码来改进它?
我应该使用pusher.com 之类的东西吗?
有很多关于实现长轮询的教程,但我想尽可能简单。
我有一个简单的网络应用程序,其中列出了一组私人人员和他们发布的最后一条消息。
我目前只是通过使用 Ajax 每 30 秒访问一个 php 脚本进行轮询,该脚本获取所有人员和最新消息,然后以 JSON 形式返回。我解析并更新 DOM。
由于大部分时间效率不高,没有任何变化,但它仍然每 30 秒获取所有数据。
有什么基本的我可以做的,只是用代码来改进它?
我应该使用pusher.com 之类的东西吗?
有很多关于实现长轮询的教程,但我想尽可能简单。
当您每 30 秒使用一次请求 http 时,可能会使用很多资源,如果有 1000 个或更多用户,我认为这对 Web 服务器不利,
我有使用Nodejs的建议 ,node js 是一个基于 Chrome 的 JavaScript 运行时构建的平台,可以轻松快速构建,并支持长轮询和非阻塞请求。
使用 nodejs,您可以构建可以处理许多用户并用于实时应用程序的网络服务器。
有很多框架可以用 node js 实现
如果您想尝试,这是一个简单的教程.. http://martinsikora.com/nodejs-and-websocket-simple-chat-tutorial
无需更改大部分基础架构,您可以返回一条简单的消息,指示是否已更改任何内容。
因此,如果http://localhost/example/request
返回:
{
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
对于每个请求,如果没有更新,您可以改为返回以下内容:
{
"updated": false
}
此外,您还可以updated: true
表明它已更新:
{
"updated": true,
"phoneNumbers": [
{
"type": "work",
"number": "111-222-3333"
}
]
}
总的来说,您所要做的就是updated
在每个查询中检查返回对象的属性。updated
如果是,您只需要解析响应true
不过,从宏观上看,每个 HTTP 请求都会造成开销。每次轮询时,都会向浏览器发出一个新请求。拥有大量并发用户将开始引入性能问题。我建议查看诸如Node.js之类的实时 Web 框架(正如 viyancs 所提到的),因为它们为每个用户维护一个持久连接以允许“推送”数据(而不是轮询),从而减少 HTTP 开销。
在这种情况下,更好的解决方案是使用 XHR 长轮询。它的工作方式有点类似于您现在正在做的事情,即通过发出 AJAX 请求。
以下是它的工作原理:
您现在就发出 AJAX 请求。
服务器端脚本仅在有更新时返回(回显)。如果没有,它会一直循环并等待更新。这使 AJAX 请求保持挂起。
当有更新时,您的服务器端脚本返回,您的客户端 JS 更新 DOM,并立即发出新的 AJAX 请求。
PS - 为此,您必须确保脚本在 30 秒后未设置为超时。
在伪代码中,这就是您的服务器端脚本的样子
$newInfo = false;
while ($newInfo === False) {
$newInfo = getNewInfo(); // a method that returns the new info. False if nothing has changed
// sleep here for a bit
usleep(500000);
}
// will only reach here when something has changed
echo json_encode($newInfo);