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

PHP SSE无限循环客户端断开即终止,无法执行清理逻辑求助

问题分析与解决方案

你的情况确实是Windows Server 2016 + IIS 10环境下的特性导致的——和Linux/Apache环境不同,IIS在检测到客户端断开连接后,会直接终止PHP进程,不会给脚本留机会执行connection_aborted()检测或后续清理逻辑,这也是你尝试常规方法无效的核心原因。

可行的解决办法

1. 调整PHP与IIS的缓冲设置,让脚本有机会检测断开

Windows环境下的多层输出缓冲会干扰连接状态检测,需要彻底关闭缓冲:

  • 修改php.ini配置:
    output_buffering = Off
    implicit_flush = On
    zlib.output_compression = Off
    
  • 在IIS中关闭站点的响应缓冲:
    1. 打开IIS管理器,找到目标站点
    2. 双击“输出缓存”,在右侧操作栏点击“禁用”
    3. 或者在站点根目录的web.config中添加以下配置:
      <system.webServer>
        <urlCompression doStaticCompression="false" doDynamicCompression="false" />
        <httpProtocol>
          <customHeaders>
            <remove name="Content-Encoding" />
          </customHeaders>
        </httpProtocol>
      </system.webServer>
      
  • 在SSE循环中,每次输出后强制刷新两层缓冲,再执行断开检测:
    // 发送SSE心跳或数据
    echo "data: {}\n\n";
    ob_flush(); // 刷新PHP内部输出缓冲
    flush();    // 刷新IIS的响应缓冲
    
    // 检测客户端断开并执行清理
    if (connection_aborted()) {
        fwrite($socket, "再见");
        fclose($socket);
        exit();
    }
    

2. 结合ignore_user_abort(true)与循环休眠

虽然你之前尝试过ignore_user_abort(true),但需要配合循环内的短时间休眠,让脚本有机会捕获断开事件:

ignore_user_abort(true);
set_time_limit(0);

$socket = fsockopen("第三方设备地址", 端口号);

while (true) {
    // 发送SSE数据
    echo "data: ping\n\n";
    ob_flush();
    flush();

    // 检测断开并清理
    if (connection_aborted()) {
        fwrite($socket, "再见");
        fclose($socket);
        exit();
    }

    // 休眠100ms,降低CPU占用同时给系统留检测时间
    usleep(100000);
}

3. 备选方案:分离清理逻辑至独立脚本

如果上述方法仍无效,可采用间接方式实现清理:

  • 在主SSE脚本中,将第三方设备的连接状态(如socket句柄标识、连接时间)写入本地文件或数据库
  • 编写一个定时任务脚本(借助Windows任务计划),定期检查主SSE脚本的运行状态,若发现主脚本已终止,则执行清理逻辑(向第三方设备发送“再见”)

额外提示

  • PHP 7.0.9属于较老版本,存在一些Windows/IIS环境下的兼容性问题,若条件允许,升级到PHP 7.4+会显著改善连接检测的稳定性
  • 可调整IIS应用池的“进程模型”设置,将“空闲超时”设为0,避免进程被提前回收影响脚本运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:45:35