1

データベースから集約データを含むオブジェクトを生成するサーバー側のPHPスクリプトがあります。スクリプトはオブジェクトをビルドし、それをJSONにエンコードしてクライアントに返します。ここで、元のリクエストはこのjQuery.ajax呼び出しによって行われました。

$.ajax({
        async: false,
        url: 'scripts/getDataforUser.php?firstName=' + _firstName+ '&lastName=' + _lastName,
        dataType: "json",
        success: function(result) {
          //Do stuff with 'result' object
          //result object sometimes comes back empty
        },
        error:function (xhr, ajaxOptions, thrownError){
             displayError('An error occurred while fetching data');
             return;
          }
      });

私の問題は、空の結果オブジェクトが返されることがあることです。これは、より大きなリクエストで発生するようですが、一見ランダムに見えるため、原因を追跡するのは困難です。EclipseをIDEとして使用してZendServerを使用しています。スクリプトを数回デバッグして、A)データがあり、B)結果オブジェクトがjson_encode($data, JSON_FORCE_OBJECT)PHP側を使用してJSONに適切にエンコードされていることを確認しました。

繰り返しになりますが、このエラーは大きなオブジェクトでのみ発生するようです。getDataforUser.phpスクリプトを直接デバッグするときにデータを確認できるため、クライアント側に焦点を当て、Javascript側で受信時にエラーが発生するかどうかを確認します。

この時点で、サーバーからクライアントへの変換で何が失われるのかわかりません。PHPでオブジェクトをJSONエンコードする方法に問題がありますか?そのエンコードされたオブジェクトを取得するためにサーバーを呼び出すにはどうすればよいですか?両方の組み合わせ?それとも、私が見逃しているもっと根本的なものはありますか?

アップデート:

こんにちはベン、私のコメントで述べたように、問題への洞察を提供するかもしれない私の元の投稿に含めることを怠った1つの詳細は、彼のローカル開発サーバーで同じURLを実行している仲間の開発者がnullオブジェクトを返すことですが、私は空のプロパティを持つオブジェクトを取得するだけです。ローカルサーバーのPHP構成が問題になる可能性がありますか?PHP.iniファイルには、リソース制限について次の設定があります。この場合は、これで十分だと思います。

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 600     ; Maximum execution time of each script, in seconds
max_input_time = 180 ; Maximum amount of time each script may spend parsing request data
memory_limit = 128M      ; Maximum amount of memory a script may consume (128MB)

スクリプトを直接デバッグすることから、スクリプトはこのクエリを実行するのに600秒以上かかりません。制限時間内にリクエストデータを適切に解析し、メモリの枯渇に関してエラーはスローされません。

アップデート2:

私の開発環境はApacheWebサーバーを実行しています。

アップデート3:

@Ben- Apacheコアのドキュメントをざっと見てみましたが、Timeoutディレクティブのデフォルトは300秒ですが、前述のように、開発サーバーとしてZend Server CEを使用しています(Apacheの上にあります)。内部Apache構成で設定する独自のデフォルトのTimeoutディレクティブがあります。繰り返しますが、確認する必要があります。

また、明確にするために、このソフトウェアプロジェクトの私のパートナーは同じ問題を抱えていますが、空のオブジェクトを取り戻す代わりに、彼はnullを取り戻します。

アップデート4:

わかりました。ローカルWebサーバーで広範なテストと検証を行っていました。関連する詳細の1つは、クエリしているデータベースがMS SQL Serverでホストされていることです。データベース抽象化レイヤーとして、SQLServerネイティブクライアントPHPドライバーを使用しています。とにかく、ログを確認した後、データのクエリがタイムアウトし、SQLNativeClientが次のことを報告していることがわかりました。

[0] => Array
        (
            [0] => 08S01
            [SQLSTATE] => 08S01
            [1] => 258
            [code] => 258
            [2] => [Microsoft][SQL Server Native Client 11.0]TCP Provider: Timeout error [258]. 
            [message] => [Microsoft][SQL Server Native Client 11.0]TCP Provider: Timeout error [258]. 
        )

    [1] => Array
        (
            [0] => 08S01
            [SQLSTATE] => 08S01
            [1] => 258
            [code] => 258
            [2] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
            [message] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
        )

    [2] => Array
        (
            [0] => 08S01
            [SQLSTATE] => 08S01
            [1] => -2147467259
            [code] => -2147467259
            [2] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
            [message] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
        )

これは結果オブジェクトの空のデータの主なソースのようです。まだこのエラーに関する情報を検索しています。更新する必要のあるタイムアウト設定がSQLServerNative Client自体にあるのか、それともデータベース。さらに調査が必要です。

アップデート5:

データベースのタイムアウトを除外しました。リモート接続のタイムアウト設定は600秒に設定されています。タイムアウトは問題にならないように思われるため、PDOODBCドライバーを使用することをお勧めします。それを試して、このタイムアウトの問題が解決するかどうかを確認します。

最終更新の解決:

さて、PDOドライバーに切り替えることでタイムアウトの問題が解決したようです。そこで、ローカル開発マシンとステージングサーバーの両方で動作するPDOドライバーを確認しました。SQLSRVドライバーを使用しているときに、SQLServerネイティブクライアントがタイムアウトする原因はまだわかりません。今のところ、データを取得しているので、主要な問題を解決済みとしてマークします。ベンDと他のみんなのサポートに感謝します。

4

2 に答える 2

0

問題の明らかな原因は 3 つあります。それは、ajax リクエストを返す問題、呼び出されている PHP スクリプトの問題、または PHP の結果を提供する Web サーバーの問題です。私はそれがPHPの問題だと推測していますが、徹底的にするために:

$.ajax()jquery にはデフォルトのタイムアウトがありませんが、さまざまなブラウザーが ajax 要求に独自のタイムアウトを設定しているように見えるため、要求がタイムアウトしている可能性があります] 1async: falseよくわかりませんが、これは設定によってさらに複雑になる可能性があります。ブラウザのタイムアウトが ajax エラー句をトリガーし、誰かが URL から直接再現できたとコメントで指摘しているので、これはそうではないと推測していますが、firebug (または同等のもの) を使用して確認するのは簡単です。 ) トラフィックを監視します。

PHP の問題である可能性ははるかに高くなります。確認すべきいくつかの事項: 1. PHP スクリプトが (ini ファイルで) タイムアウトしていないmax_execution_timeこと、または (ini ファイルで) メモリ上限に達していないことmemory_limit。また、誤って utf8 以外の文字をエンコードしようとしていないこと、およびそれらをたまたま大きなオブジェクトでヒットしていないことを確認してください (この場合json_encode()は が返されnullます)。エラーをオンにして、エラーが生成されているかどうかを確認し、json_last_error()を実行して、json 文字列の作成に問題があったかどうかを確認してください。

最後に、Apache が問題である可能性があります。あなたのリクエストはかなり小さいように見えるので、リクエスト URL の制限に達しているとは思えませんが、php がオブジェクトを作成するのを待っている間に Web サーバーがタイムアウトしている可能性があります... TimeOuthttp.conf ファイルの値を確認してください。

于 2012-09-13T22:18:15.023 に答える
-1

URL を介して GET パラメーターを渡さないでください。代わりに「データ」プロパティを使用します。

$.ajax({.... data: { firstName: "bob", lastName: "smith" } });
于 2012-09-13T20:58:46.157 に答える