9

問題

jQuery を使用して (比較的) 大量のデータを Web システムに投稿し、Ubuntu から CentOS に移行しています (面倒なプロセスです)。問題は、受信されるデータが切り捨てられることです。サーバーからクライアントに同じデータを送信しても、切り捨ては発生しません。

「送信」されるデータの量 (つまり、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 に処理させるのではなく、最初に自分で行い、本質的に 2 回シリアル化しています。このコードは次のとおりです。

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());

サーバーに到達したら、このデータをデコードする必要があります。これは、2 回シリアル化されているためです。この「ソリューション」には追加のコストがかかります: より多くのデータを送信し、より多くの作業を行います。問題はまだ残っています: 何が問題で、本当の解決策は何ですか?

4

4 に答える 4

4

次の php.ini 変数を確認します。

post_max_size

max_input_vars - データが切り捨てられるため、実際にはこれが原因である可能性があります

于 2012-09-12T02:00:14.463 に答える
2

jQueryのajaxtimeoutパラメーターを高い数値に設定してみてください(ミリ秒単位であるため、おそらく10秒である10000が必要になります)。試す他のいくつかのオプション: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を使用する必要があります.IEは、あなたが何をしているのかを知っていて、約40分後にタイムアウトするとき、あなたを「信じません」。

実はそういえば、CentOS に移行しているとおっしゃっていますが、私にはサーバー関連の HAS のように聞こえます。あなたは単に間違った場所を見ているだけです。

ところで、CentOS おめでとうございます。私はそれを簡単な方法で行い、このアプリ専用のLAMP CentOS VM全体を用意し(これはvv乱雑です)、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 に答える