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 中做以下修改即可。
<IfModule mod_fcgid.c>
# 禁用输出缓冲(关键设置)
FcgidOutputBufferSize 0
# 增加I/O超时时间,避免长时间操作被中断
FcgidIOTimeout 3600
FcgidConnectTimeout 60
# 可选:限制每个PHP进程的请求数,防止内存泄漏
FcgidMaxRequestsPerProcess 500
# 可选:控制进程数量,根据服务器资源调整
FcgidMaxProcesses 20
FcgidMinProcessesPerClass 2
FcgidMaxProcessesPerClass 8
</IfModule># 在httpd.conf中注释掉可能干扰的模块
# LoadModule deflate_module modules/mod_deflate.so
# LoadModule cache_module modules/mod_cache.so
KeepAlive Off