PHP 8.4 处理 AI SSE 流式数据仅作为后端发起请求或代理透传,需用 curl 流式读取、禁用缓冲、逐段解析 data: 内容,严格透传响应头,并做好超时、断线重连与心跳防护。

PHP 8.4 本身不直接参与前端接收 SSE 流式数据——它不是浏览器,没有 EventSource 或 ReadableStream。如果你在 PHP 8.4 环境中“处理 AI 接口返回的 SSE 流式数据”,通常只有两种真实场景:一是 PHP 作为**后端服务**向 AI 服务发起请求并转发/消费 SSE 流;二是 PHP 作为**中间代理或网关**,需要透传、解析或改造 SSE 响应。前者更常见,也更具工程价值。
PHP 8.4 主动调用 AI SSE 接口(推荐用 curl + stream)
PHP 不支持原生 EventSource,但可以用 curl 保持长连接,边收边处理流式响应。关键点是禁用缓冲、逐行读取、识别 SSE 协议格式(data: 开头 + 双换行分隔)。
- 使用
CURLOPT_WRITEFUNCTION自定义写入回调,避免内存堆积 - 设置
CURLOPT_BUFFERSIZE为较小值(如 1024),提升实时性 - 手动解析每段:跳过
event:、id:、retry:行,提取data: ...后的内容 - 注意末尾的
\n\n是段落分界符,不是每行结尾都加 - 遇到
data: \u0003(ETX 字符)可视为流结束信号,主动断开
PHP 8.4 作为代理透传 SSE 给前端(需严格透传头)
若你的 PHP 应用是前端和 AI 服务之间的中间层(比如统一鉴权、日志、token 注入),必须原样透传 SSE 关键响应头,否则前端 EventSource 会失败。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 必须透传:
Content-Type: text/event-stream - 必须透传:
Cache-Control: no-cache和Connection: keep-alive - 禁用 PHP 输出缓冲:
while (ob_get_level()) ob_end_clean(); - 禁用
fastcgi_finish_request类机制,确保连接不被提前关闭 - 不要用
echo拼接完整响应体;要用fpassthru()或循环fread()+flush()实时转发
解析与组装 SSE 数据(PHP 侧结构化处理)
AI 返回的 data: 内容常为 JSON 字符串(如 data: {"delta":{"content":"好"}}\n\n)。PHP 8.4 可利用 json_decode($str, flags: JSON_THROW_ON_ERROR) 安全解析,并累积拼成完整回复。
立即学习“PHP免费学习笔记(深入)”;
- 用
stream_get_line($fp, 1024, "\n\n")分段读取,比正则更可靠 - 对每段用
preg_match('/^data:\s*(.+)$/m', $segment, $matches)提取 data 值 - 遇到空 data(如
data:\n\n)可忽略;遇到多行 data,需合并所有匹配行 - 建议用
Stringable或只读字符串(PHP 8.4 新增)减少拷贝开销
错误处理与超时控制(不能忽略)
SSE 连接容易因网关 idle timeout、AI 服务卡顿而中断。PHP 侧需主动兜底:
- 设置
CURLOPT_TIMEOUT为较大值(如 300),但配合CURLOPT_LOW_SPEED_LIMIT防止假死 - 捕获
CURLOPT_HEADERFUNCTION中的HTTP/1.1 502等状态码,及时重试 - 记录断连时的最后
id:,用于下次请求带Last-Event-ID头续传(需 AI 服务支持) - 避免
max_execution_time中断流:用set_time_limit(0),但务必配心跳检测防僵死


















