【问题标题】:Hitting the limit on php's max_input_vars - But don't know why达到 php 的 max_input_vars 的限制 - 但不知道为什么
【发布时间】:2018-01-15 05:48:10
【问题描述】:

在我正在处理的 PHP 脚本中,我似乎达到了 max_input_vars 的限制。我知道我可以增加限制(我在重构脚本时这样做了),但我不希望这成为最终解决方案。

我认为max_input_vars 的工作方式是为数组的每个嵌套级别分配的元素数量少于max_input_vars 的值。

因此,假设max_input_vars 的值设置为 1000,那么像 $array1[999][999] 这样的二维数组就可以了。

但是,如果将二维数组(例如 $array2[1010][2])设置为 1000,则会违反该值。

我的理解正确吗?如果没有,这个设置是如何真正起作用的?

为了完整起见,我的 POST 字符串如下所示:

注意:我从我的浏览器检查器中复制了这个,位于请求的“表单数据”部分下。我获取了 URL 编码值并通过parse_str 传递它以使其可读。

array(172) {
  ["line_1"]=>
  string(11) "1_85021_1_2"
  ["line_2"]=>
  string(11) "1_85038_1_2"
  ...
  ["line_167"]=>
  string(11) "1_85077_1_2"
  ["QUANTITY"]=>
  array(167) {
    ["1_85021_1_2"]=>
    string(6) "118685"
    ["1_85038_1_2"]=>
    string(6) "237520"
    ...
    ...
  }
  ["DATE1"]=>
  array(167) {
    ["1_85021_1_2"]=>
    string(0) ""
    ["1_85038_1_2"]=>
    string(0) ""
    ...
    ...
  ["SPLIT"]=>
  array(167) {
    ["1_85021_1_2"]=>
    string(1) "2"
    ["1_85038_1_2"]=>
    string(1) "0"
    ...
    ...
  }
  ["DATE2"]=>
  array(166) {
    ["1_85021_1_2"]=>
    string(0) ""
    ["1_85038_1_2"]=>
    string(10) "08/08/2017"
    ...
    ...
  }
  ["COMMENT"]=>
  array(166) {
    ["1_85021_1_2"]=>
    string(0) ""
    ["1_85038_1_2"]=>
    string(6) "test21"
    ...
    ...
  }

对于冗长,我得到的确切错误在这里:

PHP Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0

【问题讨论】:

  • 最好的办法是将数据打包成 JSON 并将其作为一个输入变量传递。
  • 是的,这不是一个坏主意。我可能会继续这样做。但是,我仍然很好奇为什么我所拥有的东西不起作用(假设 max_input_vars 按我认为的方式工作。如果没有,我非常想了解它是如何工作的。
  • max_input_vars 是多个输入变量,可以是标量或数组。默认情况下为 1000,您可以拥有 1000 个数组或 1000 个字符串 - 没关系。不过重要的是post_max_size,默认情况下为 8MB(所有数据总计)。
  • 不知道为什么这被否决了。如果您能告诉我如何改进这个问题(以及随后的问题),我们将不胜感激。

标签: php multidimensional-array http-post settings


【解决方案1】:

每个数组元素都是它自己的变量,作为单个维度发送:

array1%5B%5D=1 & array1%5B%5D=1

对于两个维度:

array1%5B1%5D%5B0%5D=1 & array1%5B2%5D%5B0%5D=1

所以如果设置为 1000,array1[999][999] 将违反 max_input_vars,因为 array1[0][0] 彻底 array1[0][999] 是 1000 个变量。在这种情况下,添加array1[1][0] 将使其超过 1000 并生成:

警告:未知:输入变量超过 1000。要增加限制,请更改 php.ini 中的 max_input_vars。在第 0 行的未知中

【讨论】:

  • 好吧,我的理解是正确的,只是我忘记了 PHP 是 base 0。array1[998][998] 应该没问题,对吧?
  • 仅当您从array1[998][0] 开始并转到array1[998][998]
  • 对,所有维度中所有元素的总和是否超过1000无关紧要,只要每个维度不超过1000个元素即可。我想知道为什么我会收到错误消息。我在数组中的最大维度是 172。知道吗?
  • 啊,我刚看到你的编辑。因此,1000 个变量限制是跨所有数组维度的。原来我只是误解了设置是如何工作的。非常感谢您的澄清。
  • 是的,因为在 PHP 处理它们之前,变量不是数组,它们是单独的变量。
猜你喜欢
  • 2020-01-06
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多