jQuery Ajax/Apache/PHP-Post大小限制

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。奇怪的

我正在通过jquery(1.9.1)向windows机器上的apache(2.2.25)、php(5.3.28)服务器发布一篇ajax文章。HTML5/utf-8。我的帖子有3个变量。两个是非常短的文本字符串。第三个是非常大的文本字段。它包含base64编码的图像数据。当post数据总量达到一定长度(22279860个字符多一点)时,事情会以一种奇怪的方式破裂。似乎所有的数据都被发送到服务器,因为我使用的是一个一直向上的进度表。当我记录ajax结果时,它显示它已成功完成,状态代码为200。奇怪的是,响应体总是空白的。我将处理php文件分为以下几个部分:

<? 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+' &nbsp; <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+' &nbsp; <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>