遇到问题
后台编辑数据时,post提交数据,发现只有前面的部分字段保存成功,后面的字段并未保存成功。
问题分析
默认情况下,post提交的数据大小限制“post_max_size”在php.ini中默认设置为8M,经确认,提交的数据并未超过8M,可排除非数据大小导致;
php -i | grep ‘post_max_size’
经排查发现,post提交的表单最大数量限制“max_input_vars”在php.ini中默认设置为1000,经确认,提交的表单数量确实超过了1000,表单数量超过1000,便会截取超出数据,这就是保存时只有部分保存成功,部分保存失败的原因,问题定位成功。
查看表单数量的方法:
network中找到post请求的链接记录,在Headers请求中可看到FormData数据,折叠FormData即可看到post请求时提交的表单数量【见图一】,展开FormData可看到具体请求的表单数据【见图二】,可发现导致表单超限的是机构“company_organize_ids”字段,需要注意的是,company_organize_ids是以数组的形式传递的,虽然后台使用$_POST接收时是一个数组,但是在web端计算提交的表单数量时,是按照多个计算的,所以表单会超限。
解决方案
方法1、直接修改php.ini中表单提交数量最大限制的配置项 “max_input_vars”为大一些的值,这样便不会受1000的限制了。
方法2、事实上,通过方法一的改大限制的方式是治标不治本的,而且代码中一次性传递1000个表单数量,会影响执行效率,比较好的解决方案是提交数据时,不要有大量表单的提交,即将大量的表单数据处理整合为一个json或者序列化数据,作为一个表单元素。
killall php-fpm && php-fpm
反思:事实上,通过这种改大限制的方式也是治标不治本,最好还是从源头上改变,提交数据时,将数据整合好,不要有大量表单的提交。