sse实现php
SSE(Server-Sent Events)是一种服务器向客户端推送实时数据的协议,基于HTTP长连接。以下是PHP实现SSE的详细方法:
基本实现步骤
设置正确的HTTP头信息,确保浏览器识别为SSE流:
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
header('X-Accel-Buffering: no'); // 禁用Nginx缓冲
使用循环持续输出数据,并刷新缓冲区:
while (true) {
$currentTime = date('Y-m-d H:i:s');
echo "data: {$currentTime}\n\n";
ob_flush();
flush();
sleep(1);
}
事件格式规范
SSE数据需遵循特定格式:
- 每行以
field:开头(如data:、event:) - 每条消息以双换行符
\n\n结束 - 示例发送命名事件:
echo "event: update\n"; echo "data: {\"user\": \"Alice\", \"status\": \"active\"}\n\n";
中断处理与重连
客户端自动重连机制需服务器支持:
- 设置
retry:字段建议重连间隔:echo "retry: 3000\n"; // 3秒后重试 - 处理连接中断:
ignore_user_abort(true); // 防止PHP脚本因客户端断开而终止 connection_aborted() // 检测连接状态
完整示例代码
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
function sendEvent($data, $event = null) {
if ($event) echo "event: {$event}\n";
echo "data: " . json_encode($data) . "\n\n";
ob_flush();
flush();
}
$counter = 0;
while (++$counter < 10) {
sendEvent([
'time' => date('H:i:s'),
'count' => $counter
], 'tick');
sleep(1);
}
sendEvent(['action' => 'close'], 'end');
?>
注意事项
- Nginx/Apache可能需要调整配置以支持长连接
- 避免输出任何非SSE格式内容(包括错误信息)
- 生产环境建议增加身份验证和来源检查
- 浏览器兼容性:除IE/Edge Legacy外均支持
高级应用
结合数据库查询实现实时通知:
$lastId = $_SERVER['HTTP_LAST_EVENT_ID'] ?? 0;
while (true) {
$newMessages = queryMessagesSince($lastId);
foreach ($newMessages as $msg) {
sendEvent($msg, 'new_message');
$lastId = $msg['id'];
}
sleep(1);
}
通过上述方法,PHP可高效实现SSE服务端推送功能。






