PHP / JSON:收到$ _POST数组不完整

问题描述:

Around 100 rows of data are posted using $.post (JQuery) as JSON array. But for some reason not all rows are received.

The data looks more or less like this (contents are basically numbers and small strings):

rows = [["U", "0", "81949", 32 more...], ["U", "0", "81950", 32 more...] ..... ]

The way I'm sending the data is:

$.post(url+"callback=?", { data : rows }, function(){}, "json");

If I echo the number of rows (count($_POST)) received in my local version it shows "100", but at the production server it displays "25" (every time is the same amount).

Checking the request details in firebug, it shows correctly that all 100 has been sent.

I though it could be the PHP "post_max_size" value, but I had it set to "100M", which I think is by far enough.

I'm pretty sure it has to be with the server settings, but I'm out of ideas... Thanks in advance.

UPDATE:

  • The production server has 8GB of Memory, which is using about half of it (it is not a memory issue).
  • There is no timeout (all the process is done in about 3 seconds).

使用$ .post(JQuery)作为JSON数组发布大约100行数据。 但由于某种原因没有 收到所有行。 p>

数据看起来或多或少像这样(内容基本上是数字和小字符串): p>

  rows =  [[“U”,“0”,“81949”,32更多......],[“U”,“0”,“81950”,32更多...] .....] 
   code>  pre> 
 
 

我发送数据的方式是: p>

  $ .post(url +“callback =?”,{data  :rows},function(){},“json”); 
  code>  pre> 
 
 

如果我回显在本地收到的行数(count($ _ POST)) 它显示“100”版本,但在生产服务器上显示“25”(每次都是相同的数量)。 p>

检查firebug中的请求详细信息,它正确显示已发送所有100个。 p>

我虽然它可能是PHP“post_max_size”值,但我把它设置为“100M”,我认为这已经足够了。 p> 我很确定它必须与服务器设置有关,但我没有想法...... 提前谢谢。 p>

更新: strong > p>

  • 生产服务器有8GB的内存,占用了大约一半的时间(这不是内存问题)。 li>
  • 没有超时(所有过程都在大约3秒内完成)。 li> ul> div>

Is your production server using suhosin? Suhosin is often a culprit for limiting the request sizes, both GET and POST. They have separate limits for POST and GET sizes (and in fact one affects the other from what I remember, thus both have to be increased).

Take a look at your phpinfo() and see if there's anything about suhosin there.

Suhosin values that may affect you:

  • suhosin.get.max_vars
  • suhosin.post.max_vars
  • suhosin.request.max_vars

(+ their equivalents for value and var length)

Also, if you're uploading files, then this too is limited by suhosin:

  • suhosin.upload.max_uploads (which is, consequently, 25 by default)

There is a maximum size for query data - see here. The problem could be one of 2. Either part of the data is being received, or PHP is removing data after a certain amount. See here for this setting in PHP.

There is already an accepted answer, but for those not using suhosin, the problem may be a low "max_input_vars" php setting. Mine was set to 1000 by default, which was not enough.