5

現在、SOAPWebサービスに大きく依存しているWebサイトでパフォーマンスの調整を行うことを検討しています。しかし...私たちのサーバーはベルギーにあり、接続するWebサービスはサンフランシスコにあるので、控えめに言っても長距離接続です。

私たちのウェブサイトはPHPを利用しており、PHPに組み込まれているSoapClientクラスを使用しています。Webサービスへの呼び出しには平均で0.7秒かかり、ページごとに約3〜5回のリクエストを実行しています。可能なすべての要求/応答キャッシュはすでに実装されているため、接続速度を向上させる他の方法を検討しています。

これはSoapClientをインスタンス化するコードです。私が今探しているのは、単一のリクエストの速度を向上させる他の方法/メソッドです。誰かアイデアや提案がありますか?

private function _createClient()
{
    try {

        $wsdl = sprintf($this->config->wsUrl.'?wsdl', $this->wsdl);
        $client = new SoapClient($wsdl, array(
            'soap_version'       => SOAP_1_1,
            'encoding'           => 'utf-8',
            'connection_timeout' => 5,
            'cache_wsdl'         => 1,
            'trace'              => 1,
            'features'           => SOAP_SINGLE_ELEMENT_ARRAYS
        ));

        $header_tags = array('username' => new SOAPVar($this->config->wsUsername, XSD_STRING, null, null, null, $this->ns),
                             'password' => new SOAPVar(md5($this->config->wsPassword), XSD_STRING, null, null, null, $this->ns));
        $header_body = new SOAPVar($header_tags, SOAP_ENC_OBJECT);
        $header = new SOAPHeader($this->ns, 'AuthHeaderElement', $header_body);

        $client->__setSoapHeaders($header);

    } catch (SoapFault $e){
        controller('Error')->error($id.': Webservice connection error '.$e->getCode());
        exit;
    }

    $this->client = $client;
    return $this->client;
}
4

6 に答える 6

5

したがって、根本的な問題は、実行する必要のあるリクエストの数です。グループ化されたサービスを作成するのはどうですか?

  • Webサービスを担当している場合は、同時に複数の操作を実行する特殊なWebサービスを作成して、メインアプリがページごとに1つのリクエストを実行できるようにすることができます。
  • そうでない場合は、SFの近くにアプリサーバーを再配置できます。
  • すべてのサーバーを再配置できず、新しい専用のWebサービスを作成できない場合は、Webサービスサーバーの近くにブリッジを追加できます。このブリッジは、専用のWebサービスを提供し、アトミックWebサービスの呼び出しを担当します。たとえば、0.7s * 5の代わりに、0.7s + 5*0.1になります。
于 2010-05-04T08:50:47.467 に答える
3

各リクエストの速度を低下させるのはネットワーク遅延であることを確かに知っていますか?ブノワが言うように、0.7秒は長いラウンドタイムの​​ようです。私はいくつかのベンチマークを行うことを検討します-これはcurlで行うことができますが、これがあなたの石鹸クライアントでどのように機能するかはわかりません。

何かのようなもの:

$ch = curl_init('http://path/to/sanfrancisco/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
$info = curl_getinfo($ch);

$info、、、、、およびの要素total_timeを含む配列を返します。これらから、DNS、リクエスト、実際の石鹸サーバー、または時間を費やしている応答のいずれであるかを判断できるはずです。namelookup_timeconnect_timepretransfer_timestarttransfer_timeredirect_time

私が思いついた明らかなことの1つは、ドメインまたはIPを介してSOAPサーバーを要求しているということです。ドメインを使用している場合、DNSによって処理速度が大幅に低下している可能性があります(ただし、いくつかの段階でキャッシュされます)。ローカルのDNS時間(soapクライアントまたはphp.iniで-わからない)とドメインのTTL(DNSゾーンで)を確認します。SanFranサーバーの静的IPを設定し、まだ参照していない場合はその方法で参照します。

于 2010-05-04T10:01:34.097 に答える
3

PHP.INI

output_buffering = On
output_handler = ob_gzhandler
zlib.output_compression = Off
于 2010-04-13T14:54:48.300 に答える
2

キャッシュとHTTP圧縮を使用して、サーバー(クライアントではありません!)のHTTP応答を最適化します。yahoohttp ://developer.yahoo.com/performance/rules.htmlでヒントを確認してください

于 2010-05-05T10:49:54.443 に答える
1

1サイトの出力と同様に、httpコンテンツにgzip圧縮を使用するようにsoapサーバーをアサートできます。SFへの0.7の切り上げは少し長いようです。どちらのウェブサービスも答えるのが長いか、重要なnatworkの待ち時間があります。可能であれば、ベルギーのサーバーを他のホスティング会社に試してみてください。フランスでは、米国への接続が他の会社よりもはるかに優れている国もあります。あるホストから別のホストにWebサイトを移動した経験があり、パリとニューヨークの間のネットワーク遅延はほぼ2倍になりました。それは巨大で、米国からの訪問者が多い私のクライアントはそれに不満を持っていました。WebサーバーをSFに再配置するソリューションはオプションであり、サーバー間の接続がはるかに向上しますが、訪問者が主にヨーロッパにいる場合は遅延に注意してください。

2xcacheやAPCなどのオペコードキャッシュメカニズムを使用できます。それは石鹸の待ち時間を変更しませんが、phpの実行時間を改善します。

3 soapリクエストが繰り返されるかどうか、およびコンテンツの更新を延長できる期間に応じて、soap結果のキャッシュを使用して実際に改善することができます。ファイルやDBキャッシュシステムよりもはるかに高速であるため、メモリ内キャッシュシステム(xcache / memcachedなど)を使用することをお勧めします。

クラスから見ると、createclientメソッドは、キャッシュするのに最も適した模範的な機能ではありませんが、読み取り操作の場合は、perfを実行するための最良の方法です。

private function _createClient()
{
  $xcache_key = 'clientcache'
  if (!xcache_isset($key)) {
      $ttl = 3600; //one hour cache lifetime
      $client = $this->_getClient(); ///private method embedding your soap request          
      xcache_set($xcache_key, $client, $ttl);
      return $client;
   }
   //return result form mem cache
   return xcache_get($xcache_key);
}

例はxcache拡張用ですが、他のシステムを非常によく似た方法で使用できます

4さらに進んで、同様のメカニズムを使用してphp処理結果をキャッシュできます(テンプレートレンダリング出力やその他のリソース消費操作など)。このテクニックで成功するための鍵は、どの部分がキャッシュされているかを正確に知ることと、それがどれだけ長くリフレッシュされないかを知ることです。

于 2010-05-04T09:48:50.963 に答える
-1

AJAXインターフェースを使用する可能性があります。リクエストがバックグラウンドで発生する可能性がある場合は、応答を待つ必要はないようです。

于 2010-05-07T05:36:28.693 に答える