近期對接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