我正在开发一个用户可以请求服务的Web应用程序,并且提供商可以回复他。因此,当用户请求某种服务时,我们的应用程序将向提供者发送通知(要求他回复用户)。 我想要做的是:当用户请求服务时,提供商立即获得通知(像facebook那样)。
获得此功能的一种方法是使用AJAX每5-10秒向服务器发送一次请求;我们称之为民意调查(据我所知)。但是,这种方法存在一些缺陷,我看到了: -
所以,我想知道是否有一些技术可以在我们的系统中发生更改时立即更新我们的网页,而无需使用AJAX轮询请求。
答案 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
}
如果您需要更多信息,请询问