我正在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 />
有没有办法让PHP不计算输入变量(或者我应该只是压制启动警告)?
答案 0 :(得分:14)
出了点问题,你不需要1000个变量。重新编程您的程序以接受1个具有1000个键的变量数组。这是错误是警告你,你没有按照推荐的方式做事。不要以任何方式禁用,扩展或隐藏它。
答案 1 :(得分:10)
我发现直接在PHP中处理json数据的正确方法(通过file_get_contents('php://input')
)是为了确保请求在HTTP请求标头中设置正确的内容类型,即Content-type: application/json
。 / p>
在我的情况下,我使用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))
);
请注意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 :(得分:5)
根据max_input_vars
php.ini
中的$_GET
角色:
可以接受多少输入变量(限制适用于
$_POST
,$_COOKIE
和E_WARNING
超全球分开)。使用此指令 减少使用哈希的拒绝服务攻击的可能性 碰撞。如果输入变量多于此指定的输入变量 指令,发出max_input_vars
,进一步输入变量 从请求中截断。此限制仅适用于每个嵌套 多维输入数组的级别。
您必须在php.ini
中将更大的数字归因于{{1}}。
答案 3 :(得分:3)
实际上,使用max_input_vars
文件更改.htaccess
正在运行,但您需要重新启动Apache服务。
遵循完整的流程:
C:\xampp\apache\conf\httpd.conf
httpd.conf
xampp/htdocs
AllowOverride
#
之前显示AllowOverride
,请删除#
AllowOverride
php_value max_input_vars 10000
答案 4 :(得分:2)
更改此
; max_input_vars = 1000
到此
max_input_vars = 3000
php.ini 文件中的注释行是
;
答案 5 :(得分:1)
在php.ini中更改max_input_vars并不适合我
使用.htaccess文件更改max_input_vars正在运行。
如果要使用.htaccess文件更改“max_input_vars”,请转到C:\ xampp \ apache \ conf \ httpd.conf文件(在xampp中),在.htaccess文件中添加以下代码。
php_value max_input_vars 10000
答案 6 :(得分:1)
我认为大多数时候不必增加max_input_vars
的大小,
但要优化代码,
从一个ajax请求获取所有结果并将结果发送到另一个ajax请求时,我遇到了这个问题。
所以我要做的是从数据库结果中将数组字符串化,
JSON.stringify(totalResults);
在JavaScript JSON.stringify
中将数组转换为字符串,因此在转换后,我已将该字符串发送到另一个请求,并再次使用json_decode
将该字符串解码为数组在PHP中,strong>,
<?php $totalResults = json_decode($_POST['totalResults']); ?>
所以我又得到了那个原始数组,
我希望这可以对某人有所帮助,所以我分享了它,谢谢。
答案 7 :(得分:0)
我遇到了同样的问题。我发现我在 POST 数据中发送了一个 2Mb 的文件,有时它被奇怪地解释为 JSON,它会找到所有这些变量。
我最终使用文件参数发送了信息,但文件内容仍在 POST 数据中。
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_INFILE, ($fp = fopen("filename.txt", "r")));
fclose($fp);
答案 8 :(得分:-1)
也就是说,我实施了以下操作来防止这种情况再次发生:
$limit = (int)ini_get('max_input_vars');
if (count($_GET) >= $limit) {
throw new Exception('$_GET is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
}
if (count($_POST) >= $limit) {
throw new Exception('$_POST is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
}
if (count($_COOKIE) >= $limit) {
throw new Exception('$_COOKIE is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
}
请注意,截断不一定在限制处发生。我的限制设置为默认值1000,但是$_POST
仍然有1001个元素。