Предупреждение: Входные переменные превысили 1000


Я создаю похожий на REST сервис на PHP, который должен принимать большие сообщения 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 не считать входные переменные (или я должен просто отменить предупреждения о запуске)?

 11
Author: George Cummins, 2013-05-10

6 answers

Что-то не так, вам не нужно 1000 переменных. Перекодируйте свою программу, чтобы принять 1 массив переменных с 1000 ключами. Эта ошибка предназначена для того, чтобы предупредить вас о том, что вы делаете что-то не так, как рекомендуется. Не отключайте его, не расширяйте и не скрывайте каким-либо образом.

 11
Author: chugadie, 2016-03-17 12:49:49

Я обнаружил, что правильный способ обработки данных json непосредственно в PHP (через file_get_contents('php://input')) состоит в том, чтобы убедиться, что запрос задает правильный тип содержимого, т.Е. Content-type: application/json в заголовке HTTP-запроса.

В моем случае я запрашиваю страницы из php, используя curl с этим кодом:

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 не оценивает переменные post с определенным набором Content-type.

 8
Author: Fredrik Erlandsson, 2016-03-21 08:16:40

В соответствии с руководством по php max_input_vars в php.ini роли:

Сколько входных переменных может быть принято (ограничение применяется к $_GET, $_POST и $_COOKIE суперглобальный отдельно). Использование этой директивы снижает вероятность атак типа "отказ в обслуживании", в которых используются коллизии хэшей. Если входных переменных больше, чем указано в этой директиве, выдается E_WARNING, и дальнейшие входные переменные усекаются из запроса. Это ограничение применяется только к каждому уровень вложенности многомерного входного массива.

Вам просто нужно приписать большее число max_input_vars в вашем php.ini.

 4
Author: Mateusz, 2016-10-18 05:43:59

Действительно, изменение 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)
 3
Author: Marco, 2016-03-17 13:25:47

Измените это

; max_input_vars = 1000

К этому

max_input_vars = 3000

Строка комментария в php.ini файл

;
 2
Author: Faridul Khan, 2018-05-28 10:59:12

Изменение max_input_vars в php.ini не сработало для меня

Изменение max_input_vars с помощью файла .htaccess работает.

Если вы хотите изменить "max_input_vars" с помощью файла .htaccess, перейдите к C:\xampp\apache\conf\httpd.conf файл (в xampp) добавьте в себя следующий код.файл htaccess.

Php_ Значение max_input_vars 10000

 1
Author: Dasun Lahiru, 2015-12-28 15:16:21