PHP 8.x下Server Sent Events(SSE)无法实时更新问题求助
解决PHP 8.1下SSE实时输出问题
你的核心问题是输出被缓冲了——不管是PHP自身、Web服务器还是反向代理,都可能把输出攒到一定量才发给客户端,导致消息批量出现。以下是针对性的解决步骤:
强制关闭PHP输出缓冲
在sse.php开头添加这段代码,彻底禁用PHP的缓冲机制:// 关闭所有系统级输出缓冲 @ini_set('output_buffering', 'off'); @ini_set('zlib.output_compression', false); @ini_set('implicit_flush', true); // 清空已存在的缓冲层 while (ob_get_level() > 0) { ob_end_flush(); } ob_implicit_flush(true);设置正确的SSE响应头
必须添加这些头信息,避免缓存和反向代理缓冲:header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); header('Connection: keep-alive'); header('X-Accel-Buffering: no'); // 重点!禁用Nginx等反向代理的缓冲每个消息后手动刷新输出
即使关闭了缓冲,部分环境仍需手动触发发送,在每个消息输出后加flush():while(true) { echo "data: " . date('Y-m-d H:i:s') . "\n\n"; flush(); // 强制把当前输出推给客户端 sleep(1); }检查主机服务商的服务器配置
很多云主机或虚拟主机默认开启了反向代理(如Nginx)的缓冲,你可以:- 若用Apache,在
.htaccess里添加:php_flag output_buffering off php_flag zlib.output_compression off - 若联系服务商,要求禁用站点的
proxy_buffering(Nginx)或类似缓冲设置
- 若用Apache,在
完整的sse.php示例:
<?php // 关闭输出缓冲 @ini_set('output_buffering', 'off'); @ini_set('zlib.output_compression', false); @ini_set('implicit_flush', true); while (ob_get_level() > 0) { ob_end_flush(); } ob_implicit_flush(true); // 设置SSE响应头 header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); header('Connection: keep-alive'); header('X-Accel-Buffering: no'); // 循环发送实时消息 while(true) { echo "data: " . date('Y-m-d H:i:s') . "\n\n"; flush(); sleep(1); } ?>
内容的提问来源于stack exchange,提问作者John Linford
相关产品推荐
相关产品推荐

