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

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

Ответ 1

Я выяснил, что правильный способ обработки json-данных непосредственно в PHP (через file_get_contents('php://input')) состоит в том, чтобы убедиться, что запрос устанавливает правильный тип содержимого i.e. 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 не оценивает пост-переменные с определенным Content-type.

Ответ 2

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

Ответ 3

Согласно php manual max_input_vars в php.ini роль:

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

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

Ответ 4

В действительности, изменение max_input_vars с использованием файла .htaccess работает, но вам нужно перезапустить службу Apache.

Следуйте за полным процессом:

  • Перейдите к C:\xampp\apache\conf\httpd.conf
  • Открыть файл httpd.conf
  • В файле найдите xampp/htdocs
  • Немного ниже, вы можете увидеть такую ​​строку: AllowOverride
  • Если эта строка показывает # до AllowOverride, удалите #
  • Следующая строка после AllowOverride insert php_value max_input_vars 10000
  • Сохраните файл и закройте
  • Наконец STOP Apache и Restart (он будет работать сразу после перезапуска apache)

Ответ 5

Изменить это

; max_input_vars = 1000

К этому

max_input_vars = 3000

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

;

Ответ 6

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

Измените max_input_vars, используя файл .htaccess.

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

php_value max_input_vars 10000

Ответ 7

Я думаю, что в большинстве случаев нет необходимости увеличивать размер max_input_vars,

но оптимизировать ваш код,

Я столкнулся с этой проблемой при получении всех результатов из одного запроса AJAX и отправки этих результатов в другой запрос AJAX.

Итак, что я сделал, это строковый массив из результатов БД,

JSON.stringify(totalResults);

в javascript JSON.stringify преобразует массив в строку, поэтому после преобразования я отправил эту строку в другой запрос и снова декодировал эту строку в массив, используя json_decode в php,

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

так что я снова получил этот оригинальный массив,

Я надеюсь, что это может помочь кому-то, поэтому я поделился этим, спасибо.

Ответ 8

В JavaScript я пытаюсь загрузить изображение (около 1 МБ) на сервер с XHR

xhr.open('post', 'php/upload-file.php?subd=' + subdir, true);
xhr.setRequestHeader("X-File-Name", file.name);
xhr.setRequestHeader("X-File-Size", file.size);
xhr.send(file);

в php файле:

function copy_to($tgt){
    $fh = fopen('php://input','r');
    $fout = fopen($tgt, 'w');
    $buffer = 1024*1024;
    while (!feof($fh)) { 
      $in=fread($fh, $buffer); 
      fwrite($fout, $in);
    }
    fclose($fh);
    fclose($fout);
}

Сервер является xampp.

В IE, Edge, Chrome, Mozilla все ок. В сафари в окне 10 я получаю предупреждение max_input_vars. Зачем?

Спасибо за вашу помощь.