PHP/Apache/AJAX - POST 限制?

Posted

技术标签:

【中文标题】PHP/Apache/AJAX - POST 限制?【英文标题】:PHP/Apache/AJAX - POST limit? 【发布时间】:2012-03-30 06:26:39 【问题描述】:

我正在尝试通过 ajax (jQuery) 发送 200 万个字符大(非二进制字符串)的 POST 数据,它在 php 端总是显示为空白。这是我的代码:

var string = "<data string that is 2M chars long>";
$.ajax(
    cache: false,
    type: 'POST',
    url: 'data.php',
    data: 'data_string': string
);

在 PHP 端,我收到以下错误消息(尝试从 $_POST['data_string'] 检索数据时):

Notice: Undefined index: data_string in data.php on line ...

我检查了 php.ini 中的post_max_size,它设置为 256M 应该绰绰有余吧?我很困惑,不知道我做错了什么......

编辑:如果我制作"string" 少量数据(例如var string = 'test'),那么$_POST["data_string"] 返回test,正如预期的那样。所以我想知道在 Apache2、PHP 或浏览器本身中是否存在某种数据限制?我正在使用谷歌浏览器 17.0.963.79

EDIT2:memory_limit = 256M 在 php.ini 中

EDIT3:max_input_time = -1 在 php.ini 中

EDIT4:var_dump($_POST) 返回 Array(0)

EDIT5:在 debian Squeeze 上运行 PHP5 的最新稳定版本:带有 Suhosin-Patch (cli) 的 PHP 5.3.3-7+squeeze8(构建时间:2012 年 2 月 10 日 14:12:26)

【问题讨论】:

对于明显更小的字符串(例如test)是否仍然存在相同的错误?未定义的索引使它看起来好像没有被发布。 不,小文本数据不会出现错误。 尝试var_dump($_GET); var_dump($_POST); 如果没有,检查 apache 配置文件是否有可能的限制 你使用的是什么 php 版本?由于哈希冲突 DOS 攻击,php 最近对发布数据处理进行了一些侵入性更改。 每个 HTTP 服务器实现(Apache、IIS 等)都有自己的 POST 操作数据限制设置。如果您能够配置服务器,则可以在 .htaccess 文件中更改限制。 【参考方案1】:

您可能还想设置set_time_limit(0) 和您的memory limit。

编辑:您可能还想console.log(string);或 console.log(string.length); 在您请求验证设置正确之前,并在 firebug 或 chromes 开发人员工具中检查您的请求以验证您的数据是否正在发送。

【讨论】:

memory_limit = 256M, set_time_limit(0) 没有改变任何东西。 还有一个 max_input_time ini 设置。还要检查您的更改是否确实生效 我设置max_input_time为-1,问题依旧。【参考方案2】:

您必须检查您和服务器之间所有项目的限制参数。如果有代理服务器,这很难,但至少你可以检查一下:

阿帕奇:

LimitRequestBody,默认约为 2Gb,64 位可能更大,详情请查看错误日志。

PHP:

post_max_size 与 POST 大小直接相关 upload_max_filesize 可能无关,不确定 max_input_time,如果 POST 耗时过长 max_input_nesting_level 如果你的数据是一个包含很多子级别的数组 max_execution_time,但很确定不是这样 memory_limit,因为您可能会达到超出子进程允许内存的大小 max_input_vars,如果你的数据数组有很多元素

如果您已达到 Apache 的编译限制,您唯一的解决方案是避免直接 POST 如此大的数据块,您必须将其分解为多个部分。

【讨论】:

谢谢,我怀疑这个字符串太大了,我可能会把它分成几块。 谢谢你,max_input_vars 是我们的罪魁祸首。【参考方案3】:

您也可以检查 suhosin.ini 设置,例如:

suhosin.post.max_value_length = 65000

【讨论】:

【参考方案4】:
//Adding Respond Box After Selected Field
$( '[maxlength]' ).bind('click keyup', function()
    var RespondBox = '<div class="StPgRp" id="UpdateRespond"></div>';
    $('#UpdateRespond').remove();
    $(this).after(RespondBox);
);

//Counting Maximum Characters Allowed In Selected Field
$( '[maxlength]' ).bind('click keyup', function()
    var MaxLength = $(this).attr('maxlength');
    var CurrentLength = $(this).val().length;
    var Remainder = MaxLength - CurrentLength;
    $('#UpdateRespond').html('You have ' + Remainder + ' characters remaining.');
);

//Checking the PHP Function if YES then send message to user
$( '.Check' ).bind('click keyup', function()
    var Check = $(this).parent().children('.Check').val();
);

将此添加到链接到您的页面和排序的 .js 文件中!

【讨论】:

以上是关于PHP/Apache/AJAX - POST 限制?的主要内容,如果未能解决你的问题,请参考以下文章

Post 提交,参数长度有限制吗

post的参数传递长度有限制吗

Post 提交,参数长度有限制吗

post提交参数过多时,取消Tomcat对 post长度限制

使用 POST 作为 URL 字符限制的解决方法

POST和GET请求区别