我正在开发一个web应用程序,用户可以请求一个服务,提供者将可以对他作出回应。因此,当用户请求某种服务时,我们的应用程序将向提供者发送通知(要求他对用户作出响应)。我想做的是:当用户请求服务时,提供者会立即收到通知(就像facebook一样)。
一种方法是使用AJAX每5-10秒向服务器发送请求;我们称之为轮询(据我所知)。但是,这种方法有一些缺陷,我看到:-
因此,我想知道是否有什么技术可以在系统发生更改时立即更新我们的网页,而无需使用AJAX轮询请求。
发布于 2013-12-19 11:07:54
下面是一个使用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/文件
如果更改,则输出数据
然后清除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
}
如果你需要更多的信息,直接问
https://stackoverflow.com/questions/20689424
复制