28

我正在用 PHP 构建一个类似 RESTS 的服务,它应该接受一个大型 JSON 帖子作为主要数据(我发送和读取数据很像这里讨论的:http ://forums.laravel.io/viewtopic.php?id=900 )

问题是 PHP 给了我以下警告:

<b>Warning</b>:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in <b>Unknown</b> on line <b>0</b><br />

有什么方法可以让 PHP 不计算输入变量(或者我应该只是取消启动警告)?

4

10 回答 10

20

出了点问题,您不需要 1000 个变量。重新编码您的程序以接受 1 个具有 1000 个键的变量数组。这个错误是为了警告你你没有按照推荐的方式做事。不要以任何方式禁用、扩展或隐藏它。

于 2016-03-17T12:49:49.460 回答
18

改变这个

; max_input_vars = 1000

对此

max_input_vars = 3000

php.ini文件中的注释行是

;
于 2018-05-28T10:59:12.470 回答
15

我发现直接在 PHP(通过file_get_contents('php://input'))中处理 json 数据的正确方法是确保请求设置正确的内容类型,即Content-type: application/json在 HTTP 请求标头中。

就我而言,我正在使用 curl 向 php 请求页面,并使用以下代码:

function curl_post($url, array $post = NULL, array $options = array()) {
  $defaults = array(
    CURLOPT_POST => 1,
    CURLOPT_HEADER => 0,
    CURLOPT_URL => $url,
    CURLOPT_FRESH_CONNECT => 1,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FORBID_REUSE => 1,
    CURLOPT_TIMEOUT => 600
  );
  if(!is_null($post))
    $defaults['CURLOPT_POSTFIELDS'] = http_build_query($post);
  $ch = curl_init();
  curl_setopt_array($ch, ($options + $defaults));
  if(($result = curl_exec($ch)) === false) {
    throw new Exception(curl_error($ch) . "\n $url");
  }
  if(curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200) {
    throw new Exception("Curl error: ". 
      curl_getinfo($ch, CURLINFO_HTTP_CODE) ."\n".$result . "\n");
  }
  curl_close($ch);
  return $result;
}

$curl_result = curl_post(URL, NULL,
    array(CURLOPT_HTTPHEADER => array('Content-Type: application/json'),
      CURLOPT_POSTFIELDS => json_encode($out))
    );

请注意CURLOPT_HTTPHEADER => array('Content-Type: application/json')部分。

在接收端,我使用以下代码:

$rawData = file_get_contents('php://input');
$postedJson = json_decode($rawData,true);
if(json_last_error() != JSON_ERROR_NONE) {
  error_log('Last JSON error: '. json_last_error(). 
    json_last_error_msg() . PHP_EOL. PHP_EOL,0);
}

不要更改max_input_vars变量。自从更改请求以设置正确的标题后,我的问题max_input_vars就消失了。显然,PHP 不会用某些Content-type设置来评估 post 变量。

于 2016-03-21T08:16:40.173 回答
10

我认为大多数时候没有必要增加max_input_vars尺寸

但要优化您的代码

从一个 ajax 请求获取所有结果并将结果发送到另一个 ajax 请求时,我遇到了这个问题。

所以我所做的是从数据库结果中对数组进行字符串化,

JSON.stringify(totalResults);

在javascript中将JSON.stringify 数组转换为字符串,因此在转换后我将该字符串发送到另一个请求并再次使用php将该字符串解码为数组,json_decode

<?php $totalResults = json_decode($_POST['totalResults']); ?>

所以我又得到了那个原始数组,

我希望这可以帮助某人,所以我分享了它,谢谢。

于 2019-01-16T10:26:56.933 回答
5

根据php手册 max_input_vars中的php.ini作用是:

可以接受多少个输入变量(限制分别应用于和$_GET超 全局)。使用该指令可以降低使用哈希冲突的拒绝服务攻击的可能性。如果输入变量的数量多于该指令指定的数量,则会发出 an,并从请求中截断更多的输入变量。此限制仅适用于多维输入数组的每个嵌套级别。$_POST$_COOKIEE_WARNING

你只需要max_input_vars在你的php.ini.

于 2013-05-09T20:32:45.920 回答
4

确实,max_input_vars使用.htaccess文件的更改正在工作,但您需要重新启动 Apache 服务。

遵循完整的流程:

  1. C:\xampp\apache\conf\httpd.conf
  2. 打开文件httpd.conf
  3. 在文件中寻找xampp/htdocs
  4. 再低一点,你可能会看到这样的一行:AllowOverride
  5. 如果此行在删除#之前显示AllowOverride#
  6. AllowOverride插入后的下一行php_value max_input_vars 10000
  7. 保存文件并关闭
  8. 最后停止 Apache 并重新启动(它会在重新启动 apache 后工作)
于 2016-03-17T12:39:51.883 回答
1

在 php.ini 中更改 max_input_vars 对我不起作用

使用 .htaccess 文件更改 max_input_vars 正在工作。

如果要使用 .htaccess 文件更改“max_input_vars”,请转到 C:\xampp\apache\conf\httpd.conf 文件(在 xampp 中),在 .htaccess 文件中添加以下代码。

php_value max_input_vars 10000

于 2015-12-28T15:16:21.207 回答
1

我在使用响应数据进行另一个 AJAX 调用时遇到了斜杠问题,我使用stripslashes()函数来解决这个问题。

Javascript AJAX:

course_data: JSON.stringify(response.data)

PHP后端:

$course_data = json_decode(stripslashes($_POST['course_data']));
于 2021-10-30T19:05:05.550 回答
0

我有同样的问题。我发现我在 POST 数据中发送了一个 2Mb 的文件,有时会被奇怪地解释为 JSON,它会找到所有这些变量。

我最终使用文件参数发送信息,但文件内容仍在 POST 数据中。

curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_INFILE, ($fp = fopen("filename.txt", "r")));
fclose($fp);
于 2021-06-07T06:51:24.020 回答
-3

<rant>我可以接受 PHP 有这样的限制;这确实有道理。我不能接受的(也是让我很难将 PHP 作为一门编程语言认真对待的众多原因之一)是处理然后继续处理截断的数据,可能会用不完整的数据覆盖好的数据。是的,数据应该在持久化之前进行额外的验证。但这种行为只是自找麻烦。</rant>

也就是说,我实施了以下措施以防止这种情况再次发生:

$limit = (int)ini_get('max_input_vars');
if (count($_GET) >= $limit) {
    throw new Exception('$_GET is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
}
if (count($_POST) >= $limit) {
    throw new Exception('$_POST is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
}
if (count($_COOKIE) >= $limit) {
    throw new Exception('$_COOKIE is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
}

请注意,截断不一定发生在极限处。我的限制设置为默认的 1000,但$_POST最终还是有 1001 个元素。

于 2020-06-09T15:52:30.020 回答