Предупреждение: входные переменные превысили 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. Зачем?
Спасибо за вашу помощь.