Я строю 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 не учитывал входные переменные (или я должен просто отжимать предупреждения запуска)?
Что-то не так, вам не нужны 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 не оценивает пост-переменные с определенным Content-type
.
Реально, измените max_input_vars
используя файл .htaccess
но вам нужно перезапустить службу Apache.
Следуйте за полным процессом:
C:\xampp\apache\conf\httpd.conf
httpd.conf
xampp/htdocs
AllowOverride
#
до AllowOverride
удалите #
AllowOverride
вставить php_value max_input_vars 10000
Согласно php manual max_input_vars
в роли php.ini
:
Сколько входных переменных может быть принято (предел применяется к
$_GET
,$_POST
и$_COOKIE
отдельно). Использование этой директивы смягчает возможность атак на отказ в обслуживании, которые используют хеш-коллизии. Если имеется больше входных переменных, чем указано в этой директиве,E_WARNING
, а дополнительные входные переменные усекаются из запроса. Этот предел применяется только к каждому уровню вложенности многомерного входного массива.
Вам просто нужно присвоить большее число max_input_vars
в php.ini
.
Изменение 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