Server-Sent Events 连接老是自动断开怎么办?
我用 Server-Sent Events 做了个实时通知功能,但浏览器隔几分钟就断开连接,控制台还报 EventSource's connection was closed。后端是用 PHP 写的,代码大概这样:
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while (true) {
echo "data: " . json_encode(['time' => date('c')]) . "nn";
flush();
sleep(5);
}
试过加 Connection: keep-alive 也没用,是不是我哪里写错了?
第一个问题:你 echo 的数据结尾是两个 n,应该是两个换行符
nn才对,现在写成了nn,浏览器收不到完整消息块,会卡住甚至断连。正确是:第二个问题:PHP 默认的输出缓冲会把你所有 echo 挂起来,等脚本结束一次性发出去,你就算 flush() 也没用,得把缓冲关掉或者手动刷。建议开头加上:
或者直接在 PHP.ini 里把 output_buffering 关了。
第三个问题:Apache 或 Nginx 这类 Web 服务器默认会超时或断开长连接。你用的是 PHP 内置的 server 还是 Apache/Nginx?如果是 Nginx,得加:
Apache 也要关掉 ProxyTimeout 和 mod_deflate 的压缩。
最后,你那个 while(true) 脚本跑着跑着可能被 PHP 的 max_execution_time 杀掉,建议加个 timeout 限制,或者用 pcntl_signal 做优雅退出,不然连不上不是你的锅,是 PHP 自己 kill 了进程。
改完这些,再试试,基本能稳住。要是还断,用浏览器 DevTools 的 Network 面板看下 SSE 请求的状态码和响应头,是不是被 502 或 404 了。