#关于POST大表单,$_POST丢失数据问题
背景
在POST大表单时,发现PHP中的$_POST变量丢失部分数据
问题定位
调试代码
if(isset($_POST)){
echo "===raw post==";
echo file_get_contents("php://input");
echo "===real post==";
print_r(getRealPOST());
echo "====post array====";
print_r($_POST);
}
function getRealPOST() {
$pairs = explode("&", file_get_contents("php://input"));
$vars = array();
foreach ($pairs as $pair) {
$nv = explode("=", $pair);
$name = urldecode($nv[0]);
$value = urldecode($nv[1]);
$vars[$name] = $value;
}
return $vars;
}
发现通过php://input原始数据完整,$_POST丢失数据(截断)
解决问题
涉及php配置,PHP从5.3.9开始增加一个变量 max_input_vars 用来限制提交的表单数量
max_input_vars integer
它表示接受多少输入的变量(限制分别应用于 $_GET、$_POST 和 $_COOKIE 超全局变量) 指令的使用减轻了以哈希碰撞来进行拒绝服务攻击的可能性。 如有超过指令指定数量的输入变量,将会导致 E_WARNING 的产生, 更多的输入变量将会从请求中截断。
修改配置php.ini文件中max_input_vars的值(默认1000)自 PHP 5.3.9 起有效。
max_input_vars = 5000 ;默认1000,改大一些,问题解决
同时检查php配置的其他相关配置
max_execution_time = 30 ; Maximum execution time of each script, in seconds
max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
post_max_size = 8M
upload_max_filesize = 6M
nginx.conf配置
client_max_body_size 250m;
client_body_buffer_size 256k;