当前位置:首页 > PHP

sse实现php

2026-02-14 11:00:58PHP

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服务端推送功能。

sse实现php

标签: ssephp
分享给朋友:

相关文章

php实现文件上传

php实现文件上传

文件上传的基本实现 在PHP中实现文件上传需要使用$_FILES超全局数组处理上传的文件数据。表单必须设置enctype="multipart/form-data"属性,并采用POST方法提交。…

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现文件上传

php实现文件上传

PHP 文件上传实现方法 在 PHP 中实现文件上传需要处理 HTML 表单和服务器端脚本。以下是详细步骤: 创建 HTML 表单 使用 enctype="multipart/form-data"…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面…