この問題に数か月苦しんでいるので、助けを求めることにしました。現在のプロジェクトでは、いくつかの Web サービスを使用して外部サーバーと通信しています。そのうちの 1 つは大量のデータを処理し、ソープ コールは非常に長い時間がかかります。一部のメソッドの呼び出しには、最大で 5 ~ 10 秒かかります。
そのような時は対処できますが、問題は別の場所にあります。アプリケーションをホストするためにかなり強力なマシンを使用しています (専用、6 つのキセノン プロセッサ、16 GB の RAM メモリ)。外部 WS を呼び出し、サーバーが応答をリッスンすると、CPU 使用率のピークが非常に大きくなります。
いくつかの弱いマシンでテストしましたが、そのようなプロセスはシングルコアの使用率を最大 100% 使用できるようで、明らかにパフォーマンスに大きな影響を与えます。
私たちのアプリケーションは PHP Zend-Framework (バージョン 1) に基づいています。Soap クライアントとして Zend_Soap_Client を使用します。
これを最適化する方法についての提案をいただければ幸いです。前もって感謝します
編集:
コードの一部 - php SoapClient リクエストを Curl に置き換えてタイムアウトを処理する変更を実装したことを完全に忘れていました (ただし、両方のアプローチで問題が発生します)。これが私たちのクライアントの一部です:
try { $this->client = new SoapExt_Client($this->config->wsdl, array( 'cache_wsdl' => WSDL_CACHE_BOTH, 'encoding' => $this->config->encoding, 'soap_version' => SOAP_1_1, 'classmap' => array( [...] ), 'features' => SOAP_SINGLE_ELEMENT_ARRAYS ) ); $this->client->__setTimeout((int) $this->config->timeout); } catch (Exception $exc) { throw new My_Exception_System(My_Codes::ERROR_WS_CONNECTION_FAILED, array(__CLASS__)); }
そしてメソッド呼び出し:
$result = $this->client->$methodName($params);
つまり、基本的には単純なソープ コールです。スクリプトがリモート サーバーの再応答を待っている間に、CPU 使用率のスパイクが発生します。
- Web サーバーは .NET WCF サービスでホストされています。私たちのクライアント アプリは PHP でホストされています (Apache と IIS でテスト済み)。
- いいえ、デバッグ ツールは使用していません。上記のすべての発言は、ログとパフォーマンスの監視に基づいています。
- はい、WSDL にはいくつかのインポートがあります。
- よく考えてみると、大量のデータに関する部分は誤解を招く可能性があります。受信しているデータは 50 KB を超えていません。さらに、最も時間がかかる操作は大量のデータを返すわけではなく、Web サーバーの処理時間の問題です。