データベースから集約データを含むオブジェクトを生成するサーバー側の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と他のみんなのサポートに感謝します。