Предупреждение: Входные переменные превысили 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 не считать входные переменные (или я должен просто отменить предупреждения о запуске)?
6 answers
Что-то не так, вам не нужно 1000 переменных. Перекодируйте свою программу, чтобы принять 1 массив переменных с 1000 ключами. Эта ошибка предназначена для того, чтобы предупредить вас о том, что вы делаете что-то не так, как рекомендуется. Не отключайте его, не расширяйте и не скрывайте каким-либо образом.
Я обнаружил, что правильный способ обработки данных 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
.
В соответствии с руководством по php max_input_vars
в php.ini
роли:
Сколько входных переменных может быть принято (ограничение применяется к
$_GET
,$_POST
и$_COOKIE
суперглобальный отдельно). Использование этой директивы снижает вероятность атак типа "отказ в обслуживании", в которых используются коллизии хэшей. Если входных переменных больше, чем указано в этой директиве, выдаетсяE_WARNING
, и дальнейшие входные переменные усекаются из запроса. Это ограничение применяется только к каждому уровень вложенности многомерного входного массива.
Вам просто нужно приписать большее число max_input_vars
в вашем php.ini
.
Действительно, изменение max_input_vars
с помощью файла .htaccess
работает, но вам необходимо перезапустить службу Apache.
Следуйте полному процессу:
- Перейдите к
C:\xampp\apache\conf\httpd.conf
- Открыть файл
httpd.conf
- В файле найдите
xampp/htdocs
- Немного ниже вы можете увидеть такую строку:
AllowOverride
- Если в этой строке указано
#
передAllowOverride
, удалите#
- Следующая строка после
AllowOverride
вставитьphp_value max_input_vars 10000
- Сохраните файл и закройте
- Наконец ОСТАНОВИТЕ Apache и Перезапуск (он будет работать сразу после перезапуска apache)
Измените это
; max_input_vars = 1000
К этому
max_input_vars = 3000
Строка комментария в php.ini файл
;
Изменение 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