事情本身不复杂,线索都在日志里。CentOS 7.9 加 PHP 7.4 的报名表单,一次提交两千多个字段,后台只收到前一千个,剩下的复选框全是空值,前端没有任何报错,php error_log 里只留一条 warning。

第一反应是「suhosin 一类的扩展还有自己的变量上限,和 php.ini 不是同一套」,验证下来不成立。

排查方向其实有限,先把可能性排一排。max_input_vars 默认一千,超出的部分被静默丢弃并记一条 warning。少数情况下是表单用 name 数组展开,前端以为是一个字段,实际每项都算一个变量。

不容易想到的是,改的是 cli 的 php.ini,fpm 读的是另一个路径下的配置。

动手时先确认警告原文和生效值

php-fpm -i 2>/dev/null | grep -E 'max_input_vars|Loaded Configuration'

数一下表单实际提交多少字段

grep -o 'name=' /var/www/html/form.html | wc -l

调高上限并重启 fpm

sed -i 's/^max_input_vars.*/max_input_vars = 5000/' /etc/php.ini && systemctl restart php-fpm

顺便确认 nginx 没截断请求体

grep -n 'client_max_body_size' /etc/nginx/nginx.conf

恢复的判定其实很直接。两千个字段提交后后端全部收到,error_log 不再出现 Input variables exceeded 的提示,写入条数与页面显示一致。

这里还有个坑。max_input_vars 只管接收端,nginx 的 client_body_buffer_size 和 client_max_body_size 也要一起看,不然请求在更前面就被截了。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189