Javascript 无轮询的网页更新

Javascript 无轮询的网页更新,javascript,php,ajax,web,polling,Javascript,Php,Ajax,Web,Polling,我正在开发一个web应用程序,用户可以在其中请求服务,提供商可以对其作出响应。因此,当用户请求某种服务时,我们的应用程序将向提供者发送一个通知(要求他响应用户)。 我想做的是:当用户请求服务时,提供商会立即收到通知(就像facebook一样) 一种方法是使用AJAX每5-10秒向服务器发送一次请求;我们称之为投票(据我所知)。但是,这种方法有一些缺陷,我看到:- 由于请求将每5-10秒发送一次,因此服务器需要处理请求并返回空数据(非常频繁) 而且,即使没有任何更新,也无法向服务器发送请求 假设

我正在开发一个web应用程序,用户可以在其中请求服务,提供商可以对其作出响应。因此,当用户请求某种服务时,我们的应用程序将向提供者发送一个通知(要求他响应用户)。 我想做的是:当用户请求服务时,提供商会立即收到通知(就像facebook一样)

一种方法是使用AJAX每5-10秒向服务器发送一次请求;我们称之为投票(据我所知)。但是,这种方法有一些缺陷,我看到:-

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

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

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

支持

js

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 
}
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 
}
这将保持与客户端的连接打开

然后检查是否有什么改变。。。数据库/文件

如果更改,则输出数据

然后清除php缓存

等待10秒,然后再次执行


正如您所见,只有在服务器上发生更改时,客户端才会接收数据

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


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

WebSocket是双向的

服务器发送的事件是单向的。(您需要此)

编辑

sse响应中的更多数据:

js

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 
}
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 
}

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

听起来您想查看WebSocket。我建议你开始。不要担心,因为它的节点有一个服务器规范,你可以用PHP构建,你可以简单地使用socket.io-clientAs@jibsales说一个选项是websockets,另一个选项是修改类型的轮询调用long polling。我会研究这两种方法,看看哪一种更适合您。您的WebSocket的另一个可行替代方法是服务器发送事件。EventSource是此API的Javascript包装器。它们的工作方式与WebSocket类似,只是数据只来自服务器,不会再次返回。当然,您可以使用Ajax post再次发送数据。。。正如您在上面提到的,它需要等待10秒才能再次重复该过程,那么您真的认为服务器发送的事件将是一个解决方案吗?我不知道我问的是不是一个好问题。sse是为你的要求而设计的。但是php不是用来流式处理数据的。孤独肯定比投票好。通过将sleep(10)更改为sleep(3),它每3秒重复一次这个过程。我肯定会尝试SSE和WebSocket。还有一个问题,如果从php脚本中删除sleep()函数,当我调用该脚本时,如果我需要发送一些参数(如用户id或其他),该怎么办?如果删除sleep(),服务器将崩溃。3sec的速度足以得到响应。否则将其更改为1-2。。。数据可以包含字符串。所以,如果你想添加额外的数据,请将其转换为json。我添加了这个示例。我将尝试这个,投票支持你。我很快就会提出问题。