php max_input_vars限制
这是一次线上 bug,后台 sku 修改的时候,使用了大量的数组,造成了 php 端 $stock
变量无法完全解析。
stock[1][price]=1234
stock[1][stock]=99
stock[1][id]=1
// ...
stock[500][price]=1234
stock[500][stock]=99
stock[500][id]=500
由于线上的 php 版本是由低版本升级上去的,所以以前是不会有这样的问题的,PHP 5.3.9为了防止hash冲突就加了那么个参数 max_input_vars
。
曾今天真的以为上面的例子的 input vars 应该是 500 个,看了 PHP 的源码之后才发现应该是 500 * 3;其实 PHP 是按照 &
为 token 来计数的。
// vim main/php_variables.c +438
// 这里的 separator,在 GET POST 中是 &; 在 COOKIE 中是 ;
var = php_strtok_r(res, separator, &strtok_buf);
// :458
while (var) {
if (++count > PG(max_input_vars)) {
// ...
}
}
如何避免这样的问题
- 自然是想办法增加 max_input_vars 的大小,但这样有个难以逃避的问题,就是前端传过来数据的个数你是没办法知道应该是多少的
- 减少 post 的字段,先 js json_encode 一下,再用一个大字段传过来
- 使用 post 的 body 将数据传过来;在 php 端使用
file_get_contents('php://input')
来获取之后在 json_decode;我觉得这中方法比较可取,因为 restful 设计里面就采用的这种方法。