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

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)或类似缓冲设置

完整的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:02:39