没有轮询的网页更新

时间:2013-12-19 18:49:36

标签: javascript php ajax web polling

我正在开发一个用户可以请求服务的Web应用程序,并且提供商可以回复他。因此,当用户请求某种服务时,我们的应用程序将向提供者发送通知(要求他回复用户)。 我想要做的是:当用户请求服务时,提供商立即获得通知(像facebook那样)。

获得此功能的一种方法是使用AJAX每5-10秒向服务器发送一次请求;我们称之为民意调查(据我所知)。但是,这种方法存在一些缺陷,我看到了: -

  • 由于请求将每隔5-10秒发送一次,因此服务器将负载处理请求并返回空数据(非常频繁)。
  • 即使没有任何更新,也无法向服务器发送请求。
  • 想象一下,有人在服务器响应请求后立即请求服务。因此,提供商必须等待另外5-10秒才能收到有人请求的通知。

所以,我想知道是否有一些技术可以在我们的系统中发生更改时立即更新我们的网页,而无需使用AJAX轮询请求。

1 个答案:

答案 0 :(得分:2)

这是一个使用php的简单服务器发送事件脚本。

支持

https://developer.mozilla.org/en-US/docs/Web/API/EventSource

JS

var sse=new EventSource("sse.php");
sse.onmessage=function(e){
 document.body.innerHTML=e.data;
};

sse.php

header('Content-Type: text/event-stream'); // specific sse mimetype
header('Cache-Control: no-cache'); // no cache
while(true) {
 if(/*something changes*/){
  echo "id: ".time().PHP_EOL;
  echo "data: ".$data.PHP_EOL;
  echo PHP_EOL;
 }
  ob_flush(); // clear memory
  flush(); // clear memory
  sleep(10);// seconds 
}

这样可以保持与客户端的连接打开,

然后检查某些内容是否发生变化... db / file whatever

如果更改

输出数据

然后清除php缓存

等待10秒再做一次。


正如您所看到的,只有在服务器上发生了某些变化时,客户才会收到数据

但我完全不知道服务器如何处理1000人。


node.js会更好。但这取决于您使用的语言和/或是否可以实际使用node.js。

websockets是两种方式。

服务器发送的事件是单向的。(你需要这个)

修改

sse响应中的更多数据:

JS

var sse=new EventSource("sse.php");
sse.onmessage=function(e){
 console.log(JSON.parse(e.data))
};

sse.php

header('Content-Type: text/event-stream'); // specific sse mimetype
header('Cache-Control: no-cache'); // no cache
while(true) {
 if(/*something changes*/){
  echo "id: ".time().PHP_EOL;

  $dataArray=array('id'=>$id,'name'=>$name,'more'=>$more);
  echo "data: ".json_encode($dataArray).PHP_EOL;

  echo PHP_EOL;

 }
  ob_flush(); // clear memory
  flush(); // clear memory
  sleep(10);// seconds 
}

如果您需要更多信息,请询问