9

问题

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

4 回答 4

4

检查以下 php.ini 变量:

post_max_size

max_input_vars - 这实际上可能是罪魁祸首,因为它会截断数据

于 2012-09-12T02:00:14.463 回答
2

尝试将 jQuery 的 ajaxtimeout参数设置为较大的数字(注意,它以毫秒为单位,因此您可能需要 10000,即 10 秒)。其他一些可以尝试的选项: 1. 检查您的 PHP 最大执行时间是否合适。我怀疑这是否相关,但这是可能的。2. 在 jQuery 的错误函数上,console.log(xhr)XHR结果上运行(你必须在 Chrome 中执行此操作,或者找到另一种查看结果的方法)。XHR 是一个 XHR 对象,其中包含有关连接发生情况的调试信息,例如状态代码、超时信息等。

编辑:另外,您是否检查过数据库中字段的最大大小?数据库很可能会自动截断信息。

于 2012-07-25T23:23:29.007 回答
1

我的直觉是它与 php 超时有关,我从未听说过 javascript 超时 - 我让 jquery 运行了 3 或 4 个小时,但随后他们继续发布小更新(如 PHP 中的 _SESSION 进度条 .. .但我离题了..无论如何,您必须为此使用firefox,当您知道自己在做什么并在大约40分钟后超时时,IE不会“相信”您)〜当时我没有使用chrome。

实际上,想想看,你说你正在迁移到 CentOS 对我来说听起来就像是必须与服务器相关。你只是在寻找错误的地方。

BTW 恭喜 CentOS 太棒了!我会用简单的方法来做这件事,并为这个应用程序拥有一个完整的 LAMP CentOS VM(尽量不要因为它的 vv 混乱而与 vhosts 相处)并且只需将整个 apache/php 安装设置为非常高。

正确的 php.ini 设置是

max_input_time //(not max_execution_time!)
upload_max_filesize
post_max_size
// .. and try    
memory_limit
于 2012-07-27T10:36:13.663 回答
0

PHP POST/GET/COOKIE 默认限制为 1000 个条目。上面的所有内容都将被忽略。计数的是条目数,而不是实际的数据量。我建议您编辑 php.ini 并将 max_input_vars 设置设置为更大的值。

问候。

于 2013-06-20T09:01:46.117 回答