开启 fastcgi_buffering on 本身不释放 PHP-FPM 进程,但配合 fastcgi_buffer_size、fastcgi_buffers、fastcgi_busy_buffers_size、fastcgi_max_temp_file_size 四项参数,可使 Nginx 尽快收全响应并断连,从而间接加快 PHP-FPM 进程归还。

开启 fastcgi_buffering on 本身不直接释放 PHP-FPM 进程,但它配合合理缓冲参数,能让 Nginx 尽快接管响应数据、减少与 PHP-FPM 的连接等待时间,从而间接促使 PHP 进程更快结束并归还到进程池——这是“快速释放”的实际含义。
明确 fastcgi_buffering 的作用边界
该指令控制 Nginx 是否对 FastCGI 响应做内存缓冲(默认已开启)。开启后,Nginx 会把 PHP-FPM 返回的整个响应(头+体)先收进内存,再统一发给客户端。这避免了边读边传导致的长连接占用,让 PHP-FPM 在写完响应后即可关闭连接、释放进程。
注意:它不是让 PHP “提前退出”,而是让 Nginx 更早断开与 PHP 的后端连接。
必须同步配置的四项核心缓冲参数
只写 fastcgi_buffering on; 没用,必须搭配以下参数才能真正实现“收得全、不落盘、早断连”:
立即学习“PHP免费学习笔记(深入)”;
-
fastcgi_buffer_size:专存响应头。设为
16k足够覆盖常见伪静态头(含 JWT Cookie、调试头等),避免 upstream sent too big header -
fastcgi_buffers:分配响应体缓冲区。例如
fastcgi_buffers 16 32k(共 512KB),适合多数页面;报表类大响应按实测 P95 值配,如32 64k -
fastcgi_busy_buffers_size:限制“正在发送中”的缓冲上限,建议设为单 buffer size 的 2 倍,如
64k(对应32k单块)或128k(对应64k单块) -
fastcgi_max_temp_file_size:设为
0可彻底禁用临时文件落盘,强制全部走内存;若需保留兜底,建议 ≤fastcgi_busy_buffers_size,如128k
配套超时与连接策略
缓冲生效的前提是 PHP-FPM 有足够时间输出完整响应,且 Nginx 不因等待而卡住:
-
fastcgi_read_timeout:必须 ≥ PHP-FPM 的
request_terminate_timeout或脚本实际耗时。导出类接口建议设为300(5 分钟) - fastcgi_pass 和 fastcgi_param SCRIPT_FILENAME 必须正确,否则 buffering 无从触发
- PHP-FPM 端建议启用
pm = dynamic,并确保pm.max_children足够应对并发缓冲请求,避免因子进程不足导致排队等待
验证是否达成“快速释放”效果
调优后重点观察三方面:
- Nginx
error.log中不再出现 upstream sent too big response 或 using temporary file 类警告 - 用
strace -p $(pgrep nginx) -e trace=write,openat确认无对fastcgi_temp目录的写入行为 - 对比 PHP-FPM 的
slowlog,相同请求的执行时间波动明显收窄,且无因连接未关闭导致的“hang”记录



















