php flush实时输出线上环境好使,本地环境等待一段时间后一次性输出结果的原因

近期对接deepseek接口时为了拥有较好的用户体验,等待答案返回时采用了flush分布输出,但是线上环境下可以正常分布输出,同样代码在本地总是等待许久后一次性出结果,排查许久,发现竟然是本地和线上不同的php加载模式导致。

1、线上环境与本地环境区别:

1)线上环境:

Server API FPM/FastCGI

2)本地环境:

Server API CGI/FastCGI
2. PHP-FPM 与 mod_fcgid 差异

确认本地环境是否通过 mod_fcgid 运行 PHP,而线上使用 mod_php。这两种方式处理输出缓冲的机制不同:

  • mod_php:PHP 直接嵌入 Apache,flush() 可能更直接
  • mod_fcgid:PHP 作为独立进程运行,需要额外配置避免缓冲
  • mod_php:通常会逐秒输出数字(如果未被浏览器缓冲)。
  • mod_fcgid:可能会在 5 秒后一次性输出所有内容(默认缓冲)。

不同模式下的加载方式不一致,apache的配置文件 httpd.conf 中做以下修改即可。


    # 禁用输出缓冲(关键设置)
    FcgidOutputBufferSize 0
    
    # 增加I/O超时时间,避免长时间操作被中断
    FcgidIOTimeout 3600
    FcgidConnectTimeout 60
    
    # 可选:限制每个PHP进程的请求数,防止内存泄漏
    FcgidMaxRequestsPerProcess 500
    
    # 可选:控制进程数量,根据服务器资源调整
    FcgidMaxProcesses 20
    FcgidMinProcessesPerClass 2
    FcgidMaxProcessesPerClass 8

# 在httpd.conf中注释掉可能干扰的模块
# LoadModule deflate_module modules/mod_deflate.so
# LoadModule cache_module modules/mod_cache.so
 

KeepAlive Off

你可能感兴趣的:(php,开发语言)