我遇到了一个问题,即使用AJAX通过POST发送的大型数据集未在PHP中使用$_POST
变量。POST数据在浏览器和PHP之间被截断
用户通过webform上传Excel/CSV文件,并通过AJAX进行分析。这个特殊的例子有775个记录,每个记录有13个字段/元素。添加正在提交的其他字段,并且数据集中的元素少于11,000个。从我在这个主题上所做的研究来看,32位浏览器(例如Firefox,Chrome等)应该能够处理42.9亿个元素,所以我没有看到数据大小的问题,特别是响应从文件上传包含所有元素。
当整个表单提交验证并输入到数据库中时,问题只会抬头。问题是,在两个萤火虫和Chrome开发者工具的控制台显示整个数据集被提交:
做的$_POST
一个var_dump
给出了这样的:
php.ini中有'post_max_size'
集到200M。即使'upload_max_filesize'
设置为100M。这个问题发生在Firefox 32.0.3和Chrome 37.0.2062.103米,我已经测试过个人以及UAT测试过的其他旧版本(包括IE 10)。
的AJAX调用是:
new wrapper.ajax('/t1.php', {
type: 'POST',
data: data,
form: $('form[name=oppForm]'),
success: function (response)
{
if (response.result)
{
window.location = response.result;
}
},
complete: function()
{
$("#submit").loading('done');
}
});
的PHP是:
<?php
var_dump($_POST);
有什么想法?
编辑
与其他一些开发人员交谈后,我还检查了输出的php://input
,发现它确实包含整个POST数据浏览器进行发送,但该数据没有得到翻译成$ _POST正确。但是,如果我从帖子数据中删除了10个密钥,并且提交了765而不是775,它确实能够正常工作。
同时检查'max_input_vars'和'max_input_nesting_level'(后者在你的情况下应该不那么重要)。并检查是否f.e. suhosin用于运行你的PHP代码,它对传入数据的安全性有额外的限制。 – CBroe 2014-10-07 16:08:35
如果在Apache上运行,还有[limitrequestbody](http://httpd.apache.org/docs/2.0/mod/core.html#limitrequestbody)需要考虑。 – naneau 2014-10-07 16:09:19
一位开发人员建议我查看“php:// input”和$ _POST之间的区别。 file_put_contents('/ tmp/zelda4.log',print_r(file_get_contents(“php:// input”),true)); file_put_contents('/ tmp/zelda5.log',print_r($ _ POST,true)); ' 而“php:// input”确实包含浏览器声称发送的所有预期内容,但$ _POST仍未显示全部内容。 – 2014-10-07 16:24:24