私の同僚と私はこの問題に数週間困惑しています。IIS7環境でホストされているPHP5.3Webアプリケーションがあります。アプリケーションは、SQL Server 2012データベースバックエンドから結果セットをフェッチし、それをJSONオブジェクトとしてクライアントに送り返します。
問題は、オブジェクトサイズが約4MBを超えるリクエストが行われたときに発生します。したがって、応答がこのサイズを超えるたびに、接続がリセットされ、エラーが発生します。これは、Curlとこの非常に便利な.JQJSONコマンドラインパーサーを使用してローカルサーバーで確認しました。これらのツールを使用して、アプリケーションをホストしているIIS Webサーバーで要求を実行すると、4MB未満の応答は正常に完了しますが、4MBを超える応答はCurl(56)エラー「接続がリセットされました」で完了しません。
いくつかの追加の注意:
データベースに対して直接実行されるクエリは、完了するのに約20秒しかかからないため、DBのパフォーマンスは問題になりません。
ローカルデスクトップ開発環境では、Apache上でZendFrameworkを実行します。しかし、この問題はそれらのいずれでも再現できません。Webサーバーで失敗する同じ>4MBの応答オブジェクトは、ローカルのApacheホスト環境に同じ要求を行うと正常に完了します。
WebサーバーのIIS7構成設定を組み合わせて、次の変更を加えました
- 最大許容コンテンツ長とURL長をデフォルトから30MBに増やしました。
- PHP、FastCGI、IISの接続タイムアウト設定はそれぞれ5分に設定されています。完了するまでに最大1分かかる小さなクエリを実行しましたが、4 MB未満である限り、有効な応答が常に返されます。
IIS 7の応答バッファキャッシュメカニズムもPHPアプリケーションのパフォーマンスに影響を与える可能性があることを読み始めましたが、まだこの機能に慣れています。過去に同様の問題を抱えていた人、または問題が何であるかについての洞察を提供できる人がいれば、私はオープンです。この時点では、IIS7Webサーバーでこの問題を引き起こしている可能性がある他の原因がわかりません。