问题
我正在使用 jQuery 将(相对)大量数据发布到我正在从 Ubuntu 迁移到 CentOS 的 Web 系统(一个痛苦的过程)。问题是接收到的数据被截断了。从服务器向客户端发送相同的数据不会导致截断。
“发送”的数据量(即我在调试 Javascript 时看到的)是 116,902 字节(正确的数据量),而接收到的数据量大约 115,668 字节:这个数字似乎有所不同,让我相信问题可能与时间有关。事务在大约 3.1 秒内完成(接收、响应),这不是很长的时间。有什么我应该检查的设置吗?
抛开这个想法,我的 PHP 安装配置为接受 8M 的发布数据并使用 128M 的物理内存,这似乎足够了。
jQuery 代码如下。我很确定这不是问题所在,但我已按要求将其包括在内。
接收:
function synchronise_down()
{
$.ajax({url: "scripts/get_data.php",
context: document.body,
dataType: "json",
type: "POST",
success: function(result)
{
// Fix the state up.
update_data(result);
// Execute on syncronise.
execute_on_synchronise();
},
error: function(what, huh)
{
IS_WAITING = false;
}
});
}
发送:
function synchronise_up()
{
var serialised = MIRM_MODEL.serialise();
LAST_SERIALISED = new Date().getTime();
$.ajax({url: "scripts/save_model.php",
context: document.body,
dataType: "json",
data: {"model":serialised},
type: "POST",
success: function(result)
{
// Fix the state up.
update_data(result, true);
// Execute on syncronise.
execute_on_synchronise();
},
error: function(what, huh)
{
IS_WAITING = false;
}
});
}
解决方法(不能称之为解决方案)
编辑:我已经“修复”了这个问题,但不一定能找出问题所在以及解决方法。这是一个有趣的问题,所以我将描述我的解决方法并让问题悬而未决。
我正在做的不是让 jquery 处理我的大数据的序列化,而是我自己先做,本质上是序列化两次。代码如下:
function synchronise_up()
{
var serialised = JSON.stringify(MIRM_MODEL.serialise());
LAST_SERIALISED = new Date().getTime();
$.ajax({url: "scripts/save_model.php",
context: document.body,
dataType: "json",
data: {"model":serialised},
type: "POST",
success: function(result)
{
// Fix the state up.
update_data(result, true);
// Execute on syncronise.
execute_on_synchronise();
},
error: function(what, huh)
{
IS_WAITING = false;
}
});
}
当然重要的是:
var serialised = JSON.stringify(MIRM_MODEL.serialise());
现在,当它到达服务器时,我需要解码这个数据,因为它已经被序列化了两次。这种“解决方案”会增加成本:发送更多数据,做更多工作。问题仍然存在:问题是什么,真正的解决方案是什么?
最佳答案
检查以下 php.ini 变量:
post_max_size
max_input_vars - 这实际上可能是罪魁祸首,因为它会截断数据
关于PHP, AJAX : large data being truncated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11655489/