PHP,AJAX:大数据被截断

时间:2012-07-25 17:41:21

标签: php ajax apache centos

问题

我正在使用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());

现在,当它到达服务器时,我需要解码这些数据,因为它已经被序列化了两次。这种“解决方案”增加了成本:发送更多数据,做更多工作。问题仍然存在:问题是什么,真正的解决方案是什么?

4 个答案:

答案 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设置设置为更大的值。

问候。