You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript Server-Sent Event仅触发一次问题求助

Server-Sent Events仅接收一次事件后续无响应的排查方案

问题重现

参考SSE示例开发后,客户端onopen事件正常触发,但仅收到一次ping事件,后续无任何事件接收且无错误抛出;服务器端日志确认PHP持续生成输出,但客户端无法接收。

可能的原因及解决方案

1. 输出缓冲未彻底清除

PHP或Web服务器的输出缓冲会导致内容无法实时推送到客户端:

  • PHP层面:仅用ob_end_flush()可能无法彻底关闭所有缓冲区,建议在脚本开头添加:
    ob_implicit_flush(true);
    ob_end_clean(); // 清空并关闭初始缓冲区
    
    同时确保php.ini配置中output_buffering = Off。
  • Web服务器层面:
    • Nginx需禁用代理缓冲,在对应location配置中添加:proxy_buffering off;
    • Apache需禁用gzip压缩(避免缓冲),在SSE脚本路径的配置中添加:SetEnv no-gzip 1

2. SSE协议格式不规范

SSE要求每个事件字段必须以\n结尾,事件块以\n\n结束,代码中换行符写法可能存在兼容性问题:
将代码中的换行写法替换为明确的转义字符:

// 替换原ping事件输出
echo "event: ping\n";
echo 'data: {"time": "' . $curDate . '"}\n';
echo "\n\n";

// 随机消息部分同理调整
echo 'data: This is a message at time ' . $curDate . "\n\n";

3. CORS配置不匹配

客户端设置了withCredentials: true,需确保服务器端返回正确的CORS响应头:

header("Access-Control-Allow-Origin: 你的前端域名"); // 不能用*,必须指定具体域名
header("Access-Control-Allow-Credentials: true");

若为同域请求,可直接移除withCredentials: true参数简化配置。

4. 客户端连接检测失效

connection_aborted()在部分环境下可能无法准确检测客户端断开,导致服务器持续输出但连接已无效,可补充检测逻辑:

if (connection_aborted() || connection_status() !== CONNECTION_NORMAL) {
    break;
}

内容的提问来源于stack exchange,提问作者nomaam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:10:29