我正在使用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());
现在,当它到达服务器时,我需要解码这些数据,因为它已经被序列化了两次。这种“解决方案”增加了成本:发送更多数据,做更多工作。问题仍然存在:问题是什么,真正的解决方案是什么?
答案 0 :(得分:2)
尝试将jQuery的ajax timeout
参数设置为高数字(注意,它以毫秒为单位,因此您可能需要10000,即10秒)。
尝试的其他一些选项:
1.检查您的PHP最大执行时间是否合适。我怀疑这是否相关但是可能。
2.在jQuery的错误函数上,在console.log(xhr)
结果上运行XHR
(您必须在Chrome中执行此操作或找到另一种查看结果的方法)。 XHR是一个XHR对象,它包含有关连接发生情况的调试信息,例如状态代码,超时信息等
编辑:另外,您是否检查过数据库中字段的最大大小?数据库很可能会自动截断信息。
答案 1 :(得分:1)
我的直觉是,它是一个与PHP超时相关的,我从未听说过javascript超时 - 我让jquery运行了3到4个小时,但随后他们继续发布一些小的更新(比如一个_SESSION进度条) PHP ...但我离题..无论如何你必须使用firefox这个,当你知道你在做什么并且在大约40分钟后超时时IE不“相信”你~~我没有使用chrome时间。
实际上,想一想,你说你正在向我转移到CentOS声音,就像是与服务器有关。你只是在错误的地方寻找。
BTW祝贺CentOS令人惊叹!我会以简单的方式做到这一点并且只需要一个完整的LAMP CentOS VM就可以使用这个应用程序(尽量不要使用虚拟机来解决这个问题)并简单地将整个apache / php安装设置得非常高。正确的php.ini设置是
max_input_time //(not max_execution_time!)
upload_max_filesize
post_max_size
// .. and try
memory_limit
答案 2 :(得分:1)
检查以下php.ini变量:
的post_max_size
max_input_vars - 这实际上可能是罪魁祸首,因为它会截断数据
答案 3 :(得分:0)
PHP POST / GET / COOKIE默认限制为1000个条目。高于此的一切都被忽略了。它是计数的条目数,而不是实际的数据量。 我鼓励你编辑你的php.ini并将max_input_vars设置设置为更大的值。
问候。