最近项目需要用到服务器推送,网看了一些资料,最终考虑选用最轻量的SSE技术,以下是踩坑经验:服务器端推送和实时通信,如:WebSocket、Long Polling、Server-Sent Events(SSE)等。
Server-Sent Events(SSE)是一种浏览器与服务器之间单向通信的技术,可以从服务器实时地向客户端推送数据。SSE技术依赖于HTTP协议,而不需要使用WebSocket。
按网上资料做最简单的测试,却怎么也实现不了:
下面是一个简单的PHP代码示例:
<?php
//发送SSE应答 文件名sse.php
header('X-Accel-Buffering: no');
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$old_md5 = '';
//执行100次,每次睡眠3秒钟,总共300秒,也就是5分钟
for ($i=0; $i<100; $i++) {
//保持一个长连接,每隔3秒钟回答客户端一次
$data = [
'time' => date('Y-m-d H:i:s'),
'message' => 'This is a server-sent event update.',
];
echo "data: ".json_encode($data)."\n\n";
ob_flush();
flush();
//等待3秒钟,开始下一次查询
sleep(3);
}
?>
客户界面:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>sse.htm</title>
</head>
<body>
<div id="example"></div>
<script>
var source = new EventSource('sse.php')
var div = document.getElementById('example')
source.onopen = function (event) {
div.innerHTML += '<p>Connection open ...</p>'
}
source.onerror = function (event) {
div.innerHTML += '<p>Connection close.</p>'
}
source.addEventListener(
'connecttime',
function (event) {
div.innerHTML += '<p>Start time: ' + event.data + '</p>'
},
false,
)
source.onmessage = function (event) {
div.innerHTML += '<p>Ping: ' + event.data + '</p>'
}
</script>
</body>
</html>
sse.php 与sse.htm放到同一目录下执行 sse.htm
在本机iis环境下,丝毫没有动静。
坑就在这里:IIS 不支持SSE
下载nginx设置端口8080,以上测试通过
7729

被折叠的 条评论
为什么被折叠?



