关于POST大表单,$_POST丢失数据问题

2017/04/28 php

#关于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;

Search

    Table of Contents