【发布时间】:2015-04-30 14:53:27
【问题描述】:
我正在通过 jquery (1.9.1) 向 Windows 机器上的 apache (2.2.25)、php (5.3.28) 服务器发送 ajax 帖子。 HTML5/utf-8。我的帖子有 3 个变量。两个是非常短的文本字符串。第三个是一个非常大的文本字段。它包含 base64 编码的图像数据。当总帖子数据达到一定长度(超过 22279860 个字符)时,事情会以一种奇怪的方式中断。似乎所有数据都发送到服务器,因为我正在使用一个一直向上的进度表。当我记录我的 ajax 结果时,它显示它已成功完成并带有 200 状态代码。奇怪的是响应体总是空白的。我已将处理 php 文件简化为:
<? echo 'hi' ?>
但这永远不会在响应中发送。所以看起来这个请求甚至没有到达 PHP 领域。那么为什么我的服务器会发回 200 状态码呢?
我尝试过的事情
在虚拟主机中设置
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。为我减少 'data_length' 变量会使其工作,将 'string' 变量更改为 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>
【问题讨论】:
-
多大才算非常大?你能提供一些代码来演示 ajax 调用和 php 处理程序吗?
-
@chiliNUT 我用演示文件编辑了我的原始帖子。截止点取决于几件事,但我说的是 22MB 附近
标签: php jquery ajax windows apache