我正在构建一个像PHP一样的RESTS服务,它应该接受一个大的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 />
Run Code Online (Sandbox Code Playgroud)
有没有办法让PHP不计算输入变量(或者我应该只是压制启动警告)?
chu*_*die 15
出了点问题,你不需要1000个变量.重新编程您的程序以接受1个具有1000个键的变量数组.这是错误是警告你,你没有按照推荐的方式做事.请勿以任何方式禁用,扩展或隐藏它.
Far*_*han 15
改变这个
; max_input_vars = 1000
Run Code Online (Sandbox Code Playgroud)
对此
max_input_vars = 3000
Run Code Online (Sandbox Code Playgroud)
php.ini文件中的注释行是
;
Run Code Online (Sandbox Code Playgroud)
Fre*_*son 10
我发现直接在PHP(via file_get_contents('php://input'))中处理json数据的正确方法是确保请求设置正确的内容类型,即Content-type: application/json在HTTP请求头中.
在我的情况下,我正在使用curl从这个代码请求php的页面:
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))
);
Run Code Online (Sandbox Code Playgroud)
请注意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);
}
Run Code Online (Sandbox Code Playgroud)
不要更改max_input_vars变量.由于更改请求以设置正确的标题,我的问题max_input_vars就消失了.显然没有PHP评估post变量,Content-type并设置了某些变量.
我认为大多数时候没有必要增加max_input_vars大小,
但要优化您的代码,
从一个ajax请求中获取所有结果并将该结果发送到另一个ajax请求时,我遇到了这个问题。
所以我所做的是从数据库结果中字符串化数组,
JSON.stringify(totalResults);
Run Code Online (Sandbox Code Playgroud)
在javascript中将JSON.stringify 数组转换为字符串,因此在转换后我将该字符串发送到另一个请求并再次使用json_decodephp将该字符串解码为数组,
<?php $totalResults = json_decode($_POST['totalResults']); ?>
Run Code Online (Sandbox Code Playgroud)
所以我又得到了那个原始数组,
我希望这可以帮助某人,所以我分享了它,谢谢。
小智 6
确实,max_input_vars使用.htaccess文件进行更改是有效的,但您需要重新启动 Apache 服务。
请遵循完整流程:
C:\xampp\apache\conf\httpd.confhttpd.confxampp/htdocsAllowOverride#之前显示此行AllowOverride#AllowOverride插入后下一行php_value max_input_vars 10000