jQuery Ajax / Apache / PHP - 帖子大小限制

时间:2015-04-30 14:53:28

标签: php jquery ajax windows apache

我正在通过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+' &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>

1 个答案:

答案 0 :(得分:0)

您的PHP版本中是否实现了suhosin?

当我在通过POST方法推送大字符串时遇到问题时,我在php构建中关闭了suhosin。

无论您在php.ini文件中将max_post设置为什么,它都有1000000个字符的固定限制。