php实现sse
PHP 实现 SSE(Server-Sent Events)
SSE 是一种服务器向客户端推送实时数据的协议,基于 HTTP 长连接。以下是使用 PHP 实现 SSE 的方法:
设置响应头
确保服务器返回正确的响应头,标识内容类型为 text/event-stream,并关闭缓存:
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
发送事件数据
SSE 数据格式遵循 field: value 规范。常用字段包括 event(事件类型)、data(内容)和 id(事件 ID):

echo "event: message\n";
echo "data: {\"time\": \"" . date('H:i:s') . "\"}\n\n";
flush();
保持连接循环
使用循环持续发送数据,并通过 ob_flush() 和 flush() 强制输出缓冲区内容:
while (true) {
$currentTime = date('H:i:s');
echo "data: $currentTime\n\n";
ob_flush();
flush();
sleep(1);
}
客户端代码示例
HTML 前端通过 EventSource API 接收 SSE 数据:

const eventSource = new EventSource('sse.php');
eventSource.onmessage = (e) => {
console.log(e.data);
};
断开连接处理
在 PHP 中检测客户端是否断开连接,避免资源浪费:
if (connection_aborted()) {
break;
}
完整示例代码
服务器端 sse.php:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
while (true) {
$data = json_encode(['time' => date('H:i:s')]);
echo "data: $data\n\n";
ob_flush();
flush();
if (connection_aborted()) break;
sleep(1);
}
?>
注意事项
- 避免在 SSE 连接中执行长时间阻塞操作,确保数据及时推送。
- 生产环境建议增加错误处理逻辑,例如数据库连接失败时的重试机制。
- 对于高并发场景,需考虑服务器性能优化(如使用 Redis 发布订阅模式)。






