0

私の同僚と私はこの問題に数週間困惑しています。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サーバーでこの問題を引き起こしている可能性がある他の原因がわかりません。

4

2 に答える 2

0

エンコードにZend_Jsonまたは PHP 組み込みのjson_encode関数を使用していますか? php.ini で PHP の memory_limit 設定を確認します。

また、PHP のエラー レポートとエラー ログの設定 (php.ini の error_reporting および error_log ディレクティブ) も確認してください。

PHP は、HTTP 接続をリセットする代わりに、何かを出力するか、スクリプトの実行を静かに終了させると思います。

詳細については、Web サーバーのログを参照してください。

  • イベント ビューアー > Windows ログ > アプリケーション/システム > PHP FastCGI ワーカー プロセスがクラッシュしているかどうかを確認する

  • IIS ログ ファイル > 失敗した HTTP 要求の応答コードとステータスを突き止める

  • 失敗したリクエストの詳細を取得するには、IIS の「失敗したリクエスト トレース ルール」を使用します。

  • 最終的には、プロセス モニター (ProcMon) を使用してフィルター処理し、アプリケーション プール (w3wp.exe) と PHP/FastCGI プロセスのみを表示して、特定の時点での PHP と IIS のアクティビティを調べます。

于 2013-01-31T00:00:00.367 に答える