【问题标题】:jQuery Ajax / Apache / PHP - Post size limitjQuery Ajax / Apache / PHP - 帖子大小限制
【发布时间】: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+' &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>

【问题讨论】:

  • 多大才算非常大?你能提供一些代码来演示 ajax 调用和 php 处理程序吗?
  • @chiliNUT 我用演示文件编辑了我的原始帖子。截止点取决于几件事,但我说的是 22MB 附近

标签: php jquery ajax windows apache


【解决方案1】:

您的 PHP 构建中是否实现了 suhosin?

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

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

【讨论】:

    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多