
本文详解如何使用 PHP 实现一个轻量级 SSE 代理,解决前端因 CORS 限制无法直连 Facebook 流式 API(如 streaming-graph.facebook.com)的问题,通过正确设置响应状态码、头信息与流式转发机制,实现实时事件透传。
本文详解如何使用 php 实现一个轻量级 sse 代理,解决前端因 cors 限制无法直连 facebook 流式 api(如 streaming-graph.facebook.com)的问题,通过正确设置响应状态码、头信息与流式转发机制,实现实时事件透传。
在构建实时 Web 应用时,Server-Sent Events(SSE)是一种简洁高效的单向服务端推送方案。但当目标 SSE 源(如 Facebook Graph Streaming API)不支持跨域访问(CORS)时,浏览器会直接拦截请求——此时需在后端搭建一个SSE 代理层,由 PHP 服务作为中间桥梁:接收客户端 SSE 请求,转发至上游 SSE 接口,并将原始事件流无损、低延迟地透传回前端。
关键在于确保 PHP 响应符合 SSE 协议规范:
✅ 正确的 HTTP 状态码(必须为 200 OK);
✅ Content-Type: text/event-stream 头;
✅ 禁用缓存(Cache-Control: no-cache, ...);
✅ 允许跨域(Access-Control-Allow-Origin: *,生产环境建议限定域名);
✅ 持续保持连接、及时 flush() 输出缓冲区。
以下是一个健壮、可运行的 PHP SSE 代理示例:
<?php
// 强制设置 HTTP 状态码为 200,避免默认 200 可能被某些 SAPI 覆盖(如 CLI 或 FastCGI)
http_response_code(200);
// 设置 SSE 必需响应头
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Access-Control-Allow-Origin: *');
header('X-Accel-Buffering: no'); // Nginx 兼容:禁用缓冲
// Facebook Streaming API 示例 URL(请替换为你的有效 access_token 和 stream ID)
$api_url = 'https://streaming-graph.facebook.com/v19.0/{stream_id}/events?access_token={your_access_token}';
// 使用 stream_context_create 支持 HTTPS 和超时控制(强烈推荐)
$context = stream_context_create([
'http' => [
'method' => 'GET',
'timeout' => 0, // 无限等待(SSE 需长连接)
'ignore_errors' => true,
'header' => "User-Agent: PHP-SSE-Proxy/1.0\r\n"
]
]);
$handle = fopen($api_url, 'r', false, $context);
if (!$handle) {
error_log("Failed to open SSE upstream: " . print_r(error_get_last(), true));
http_response_code(502);
echo "event: error\n";
echo "data: Failed to connect to upstream\n\n";
flush();
exit;
}
// 持续读取并转发上游事件流
while (connection_status() === CONNECTION_NORMAL && !feof($handle)) {
$chunk = stream_get_contents($handle, 8192); // 分块读取,避免内存溢出
if ($chunk !== false && $chunk !== '') {
echo $chunk;
flush(); // 立即发送到客户端
}
// 可选:添加心跳保活(防止代理或负载均衡器断连)
if (ob_get_level()) {
ob_flush();
}
// 小休眠避免空转占用 CPU(非必需,但更友好)
usleep(10000); // 10ms
}
// 连接异常或上游关闭时清理
fclose($handle);⚠️ 重要注意事项:
-
务必调用
http_response_code(200):PHP 在某些 SAPI(如 Apache mod_php)中可能未显式设置状态码,导致浏览器解析失败或无限 pending;显式声明是稳定性的关键。 -
禁用输出缓冲:确保
flush()生效,必要时添加ob_end_flush()或ini_set('output_buffering', 'Off')。 -
HTTPS 上游支持:
fopen()默认不支持 HTTPS,需启用openssl扩展并配置stream_context(如上所示)。 - 错误处理与重连:生产环境应加入重试逻辑(如指数退避)、上游健康检查及日志记录。
-
Web 服务器配置:Nginx 需添加
proxy_buffering off;和proxy_cache off;;Apache 启用mod_proxy并禁用mod_deflate对 SSE 响应的压缩。
该代理模式不仅适用于 Facebook API,也广泛适配 Twitter API v2 Streaming、自建 SSE 服务等场景。核心思想始终如一:忠实复现上游事件流格式,严格遵循 HTTP/SSE 协议语义,以最小侵入性桥接前后端网络限制。
立即学习“PHP免费学习笔记(深入)”;



















