header(‘Content-Type: text/event-stream‘);是干什么的?底层原理是什么?
header('Content-Type: text/event-stream');
用于设置 HTTP 头信息,使浏览器知道接收到的是一个服务器发送事件 (Server-Sent Events, SSE) 流。SSE 是一种允许服务器推送实时更新到客户端的技术,通常用于需要实时数据更新的应用,如实时通知、股票行情、聊天应用等。
详细解释:
1. SSE 简介:
SSE 是 HTML5 提供的一种技术,它允许服务器向浏览器推送更新数据,而无需客户端轮询服务器。这意味着客户端不必反复请求服务器,而是通过一个持久的 HTTP 连接,服务器可以持续地发送数据。
2. 基本工作原理:
客户端: 浏览器通过
EventSource
对象与服务器建立连接。代码示例如下:javascriptconst eventSource = new EventSource('url-to-sse-endpoint'); eventSource.onmessage = function(event) { console.log(event.data); };
服务器: 服务器设置
Content-Type: text/event-stream
头,并发送特定格式的数据流。数据流格式如下:textdata: message1\n\n data: message2\n\n
每个消息以
data:
开头,以两个换行符结尾。
3. 详细实现步骤:
服务器端:
phpheader('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); $counter = rand(1, 10); while (true) { // 检查连接是否仍然打开 if (connection_aborted()) break; // 发送一个数据块 echo "data: This is message {$counter}\n\n"; // 刷新输出缓冲区 ob_flush(); flush(); // 随机计数器递增 $counter++; // 延迟3秒 sleep(3); }
以上代码示例中,服务器不断发送带有递增计数器的消息,每3秒发送一次。
header('Cache-Control: no-cache');
确保浏览器不缓存响应。
4. 连接管理:
- 连接保持: SSE 连接是持久的,一旦建立,服务器和客户端会保持连接,直到连接被显式关闭或出现错误。
- 自动重连: 如果连接断开,
EventSource
对象会自动尝试重新连接。
5. 优点和缺点:
优点:
- 简单易用,不需要复杂的协议或库。
- 浏览器原生支持(如 Chrome、Firefox、Safari)。
- 基于 HTTP,容易穿越防火墙和代理。
缺点:
- 只支持单向通信(服务器到客户端),如果需要双向通信,可能需要 WebSocket。
- 可能不支持老旧的浏览器或不完全支持(如 IE)。
总结:
header('Content-Type: text/event-stream');
是实现 SSE 的关键,它通知浏览器接受的是实时数据流。SSE 是一种简单而有效的实时数据传输技术,适用于各种需要实时更新的应用场景。