我正在通过jquery(1.9.1)发布一个ajax帖子到一个apache(2.2.25),php(5.3.28)服务器,它位于Windows机器上。 HTML5 / UTF-8。我的帖子有3个变量。两个是非常短的文本字符串。第三个是非常大的文本字段。它包含base64编码的图像数据。当总后期数据达到一定长度(略高于22279860个字符)时,事情会以一种奇怪的方式破裂。似乎所有数据都被发送到服务器,因为我使用的是一直上升的进度表。当我记录我的ajax结果时,它显示它已成功完成200状态代码。奇怪的是,响应体总是空白的。我已将处理php文件条带化为:
<? echo 'hi' ?>
但是从来没有在回复中发送过。所以似乎请求甚至没有到达PHP土地。那么为什么我的服务器会发回200状态代码?
我尝试过的事情
在vhosts中设置
LimitRequestFields 0
LimitRequestFieldSize 0
LimitRequestLine 0
在.htaccess中设置
php_value post_max_size 128M
php_value upload_max_size 128M
php_value memory_limit 128M
php_value upload_max_filesize 128M
LimitRequestBody 0
LimitXMLRequestBody 0
RLimitCPU max
RLimitMEM max
RLimitNPROC max
当我降低这些限制时,php确实会抛出最终出现在ajax响应体中的预期错误。
我还尝试将数据拆分为单独的变量,这似乎有效。我可以轻松地将我分开的数据量增加一倍。因此似乎在apache中存在某种行长度限制或可变长度限制。我说apache因为它似乎从ajax发送find并且似乎永远不会得到php。我还想知道jquery是否奇怪地格式化了帖子数据。
毋庸置疑,一切正常,只需少量数据,我想我正在改变所有适当的apache / php限制。我更关心的是找出限制因素是什么,而不是找到完成这项任务的不同方法。有什么想法吗?
修改
我已经整理了一个可以在PHP服务器上运行的简单演示文件。我把它剥了下来,所以它甚至不使用jquery。减少&#39; data_length&#39;变量对我来说会导致它起作用,就像更改&#39;字符串&#39;变量为false。
<?
if ($_POST[action] == 'upload') {
echo 'hi' ;
die ;
}
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<style type="text/css">
#prog_cont {
height: 10px;
font-size: 0px;
line-height: 10px;
width: 200px;
border: solid 1px black;
}
#prog {
height: 100%;
background-color: green;
width: 0%;
}
</style>
<script type="text/javascript">
window.data_length = 22279981 ; //22279981 - is just too big
window.string = true ; // false is chunked object
window.url = '?' ;
function startUpload() {
var data = {
action : 'upload'
} ;
var test_arr = {} ;
var test_str = '' ;
var inc = 0 ;
while (test_str.length < window.data_length) {
var cur = "000000011111112222222333333344444444555555556666666677777777" ;
test_str = test_str+cur ;
test_arr[inc++] = cur ;
}
if (window.string) {
data.data = test_str ;
}
else {
data.data = test_arr ;
}
var serialize = function(obj, prefix) {
var str = [];
for(var p in obj) {
if (obj.hasOwnProperty(p)) {
var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
str.push(typeof v == "object" ?
serialize(v, k) :
encodeURIComponent(k) + "=" + encodeURIComponent(v));
}
}
return str.join("&");
}
var ajax = new XMLHttpRequest() ;
ajax.open("POST", window.url, true) ;
ajax.upload.onprogress = function (ev) {
var pc = ev.loaded / ev.total * 100 ;
document.getElementById('prog').style.width = pc+'%' ;
} ;
ajax.onloadend = function (ev) {
var r = ev.originalTarget ;
console.log(r) ;
document.getElementById('results').innerHTML = '<b>Status:</b> '+r.status+' <b>Response:</b> '+r.responseText ;
} ;
var params = serialize(data) ;
console.log(params.length) ;
ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded") ;
ajax.setRequestHeader("Content-length", params.length) ;
ajax.setRequestHeader("Connection", "close") ;
ajax.send(params) ;
}
</script>
</head>
<body>
<p><a href="javascript:startUpload()">Start upload</a>
<div id="prog_cont"><div id="prog"></div></div>
<div id="results"></div>
</body>
</html>
答案 0 :(得分:0)
您的PHP版本中是否实现了suhosin?
当我在通过POST方法推送大字符串时遇到问题时,我在php构建中关闭了suhosin。
无论您在php.ini文件中将max_post设置为什么,它都有1000000个字符的固定限制。