PHP: 修改post 数组容量, 修改post变量容量, max_input_vars默认值为1000导致多表单提交失败

今天接到客服部工作人员反馈的一个客户的问题,产品是允许用户添加一个产品属性的,而每个属性是由多个表单域组成 ,这样当每添加一个属性就等于添加了n个表单域,这个客户添加的非常的多,发现在提交保存的时候总是失败,提示其中一个表单元素的索引值不存在,经测试是发现服务端接收的一些表单域丢失了一部分。

起初分析的是服务器接收的数据超出了php设置的max_post_size(其实当时已经设置了8M,足够使用了),修改了测试发现此问题仍然存在。后来将用户原来的一些添加的表单元素进行删除,再重新添加同样数据库表单域可以成功,但一旦超出一定数量的表单域就会发生丢失的情况,这个时候首先怀疑的是apache是否有类似限制接收隐藏域的指令,找了没有找到,紧接着在php中批到一个max_input_vars这个指令,意思就是说php中允许接收的最大表单域数据,到目前为止基本上是确定这个原因引起的了,奖其修改为2000,重启Apache,发现一切正常。

修改php.ini中的max_input_vars参数限制提交的表单数量

比如phpmysqladmin读取数据库表,然后写入编辑,但是数据库字段有128个,然后每个字段有11个input框,大概有1400多个input,而ax_input_vars默认值为1000.

PHP: 修改post 数组容量, 修改post变量容量, max_input_vars默认值为1000导致多表单提交失败
PHP: 修改post 数组容量, 修改post变量容量, max_input_vars默认值为1000导致多表单提交失败

修改php.ini里面加入max_input_vars

;;;;;;;;;;;;;;;;;;; 
 
; Resource Limits ; 
 
;;;;;;;;;;;;;;;;;;; 

max_execution_time = 30   //每个脚本的最大执行时间,以秒为单位 
max_input_time = 60         //每个脚本解析请求的数据可能花费的最大时间,以秒为单位 
max_input_vars = 2000 
memory_limit = 32M         //每个脚本可以使用的最大内存,以M为单位,

max_input_vars具有PHP_INI_PERDIR的可变模式,意味着无法使用ini_set更改(仅在php.ini,.htaccess或httpd.conf中)

所以最好是在 .htaccess文件里面修改,因为不是所有人都能够直接修改服务器的配置文件:

php_value max_input_vars 2000

.htaccess也可以设置其他的配置变量,如:

php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value max_execution_time 300
php_value max_input_time 300
php_value max_input_vars 2000

max_input_vars,指的是表达提交的数量,默认值为 1000。官方添加这个变量的目的是为了更好的保护服务器不受攻击。避免堵塞。

总结: 提起php中的max_input_vars 估计很少人知道这个这个指令,因为他的使用场景实在是太少了,在php.ini中这个指令的定义是指服务端最大可以接收的表单域的数量多少,默认是1000,这足够我们平时使用了。但仍然有一些特殊的情况下需要修改此值的大小。

 

本文:PHP: 修改post 数组容量, 修改post变量容量, max_input_vars默认值为1000导致多表单提交失败