jQuery Ajax/Apache/PHP-Post大小限制
我正在通过jquery(1.9.1)向windows机器上的apache(2.2.25)、php(5.3.28)服务器发布一篇ajax文章。HTML5/utf-8。我的帖子有3个变量。两个是非常短的文本字符串。第三个是非常大的文本字段。它包含base64编码的图像数据。当post数据总量达到一定长度(22279860个字符多一点)时,事情会以一种奇怪的方式破裂。似乎所有的数据都被发送到服务器,因为我使用的是一个一直向上的进度表。当我记录ajax结果时,它显示它已成功完成,状态代码为200。奇怪的是,响应体总是空白的。我将处理php文件分为以下几个部分:jQuery Ajax/Apache/PHP-Post大小限制,php,jquery,ajax,windows,apache,Php,Jquery,Ajax,Windows,Apache,我正在通过jquery(1.9.1)向windows机器上的apache(2.2.25)、php(5.3.28)服务器发布一篇ajax文章。HTML5/utf-8。我的帖子有3个变量。两个是非常短的文本字符串。第三个是非常大的文本字段。它包含base64编码的图像数据。当post数据总量达到一定长度(22279860个字符多一点)时,事情会以一种奇怪的方式破裂。似乎所有的数据都被发送到服务器,因为我使用的是一个一直向上的进度表。当我记录ajax结果时,它显示它已成功完成,状态代码为200。奇怪的
<? echo 'hi' ?>
在.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是否对post数据进行了奇怪的格式化
不用说,只要有少量数据,一切都可以正常工作,我想我正在改变所有适当的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>
#进度控制{
高度:10px;
字体大小:0px;
线高:10px;
宽度:200px;
边框:实心1px黑色;
}
#进步{
身高:100%;
背景颜色:绿色;
宽度:0%;
}
window.data_length=2227981//22279981-太大了
window.string=true;//false是分块对象
window.url='?';
函数startupboad(){
风险值数据={
操作:“上传”
} ;
var测试_arr={};
var测试_str=“”;
var inc=0;
while(测试长度<窗口数据长度){
var cur=“0000000 1111111 222222 3333 444444 555555 66666666 777777”;
test_str=test_str+cur;
测试_arr[inc++]=cur;
}
if(window.string){
data.data=test_str;
}
否则{
data.data=测试结果;
}
var serialize=函数(obj,前缀){
var-str=[];
用于(obj中的var p){
if(对象hasOwnProperty(p)){
变量k=前缀?前缀+“[”+p+“]”:p,v=obj[p];
str.push(typeof v==“object”?
序列化(v,k):
encodeURIComponent(k)+“=”+encodeURIComponent(v));
}
}
返回str.join(“&”);
}
var ajax=new-XMLHttpRequest();
open(“POST”,window.url,true);
ajax.upload.onprogress=函数(ev){
var pc=ev.loaded/ev.total*100;
document.getElementById('prog').style.width=pc+'%';
} ;
ajax.onloadend=函数(ev){
var r=ev.原始目标;
控制台日志(r);
document.getElementById('results').innerHTML='状态:'+r.Status+'响应:'+r.responseText;
} ;
var params=序列化(数据);
控制台日志(参数长度);
setRequestHeader(“内容类型”、“应用程序/x-www-form-urlencoded”);
setRequestHeader(“内容长度”,参数长度);
setRequestHeader(“连接”、“关闭”);
发送(params);
}
您的PHP版本中是否实现了suhosin
当我无法通过POST方法推送大字符串时,我在php构建中关闭了suhosin
无论您在php.ini文件中将max_post设置为什么,它都有1000000个字符的固定限制。多大是非常大?你能提供一些代码来演示ajax调用和php处理程序吗?@chiliNUT我用演示文件编辑了我的原始帖子。截止点取决于一些事情,但在我所说的22MB附近
<?
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>