Ускорение мыльного сайта - PullRequest
5 голосов
/ 13 апреля 2010

В настоящее время мы рассматриваем некоторые изменения производительности на веб-сайте, которые в значительной степени зависят от веб-службы Soap. Но ... наши серверы расположены в Бельгии, а веб-сервис, к которому мы подключаемся, расположен в Сан-Франциско, так что это соединение на расстоянии, если не сказать больше.

Наш веб-сайт работает на PHP и использует встроенный в класс SoapClient класс PHP. В среднем звонок на веб-сервис занимает 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;
}

Ответы [ 6 ]

5 голосов
/ 04 мая 2010

Итак, корень проблемы в количестве запросов, которые вы должны сделать. А как насчет создания сгруппированных сервисов?

  • Если вы отвечаете за веб-сервисы, вы можете создать специализированные веб-сервисы, которые выполняют несколько операций одновременно, поэтому ваше основное приложение может просто выполнить один запрос на страницу.
  • Если нет, вы можете переместить сервер приложений рядом с SF.
  • Если перемещение всего сервера невозможно и вы не можете создавать новые специализированные веб-сервисы, вы можете добавить мост, расположенный рядом с сервером веб-сервисов. Этот мост будет предоставлять специализированные веб-сервисы и отвечать за вызов атомарных веб-сервисов. Например, вместо 0,7 с * 5 вы получите 0,7 с + 5 * 0,1.
3 голосов
/ 04 мая 2010

Вы точно знаете, что задержка в сети замедляет каждый запрос?Бенуа говорит, что 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, namelookup_time, connect_time, pretransfer_time, starttransfer_time и redirect_time.Из них вы сможете выяснить, занимает ли это DNS, запрос, фактический сервер мыла или ответ.

Одна очевидная вещь, которая только что пришла мне в голову, это то, что вы запрашиваете сервер SOAPчерез домен или IP?Если вы используете домен, ваш DNS может значительно замедлить работу (хотя он будет кэшироваться на нескольких этапах).Проверьте ваше местное время DNS (в вашем мыльном клиенте или php.ini - не уверен) и TTL вашего домена (в вашей зоне DNS).Настройте статический IP-адрес для своего сервера SanFran и укажите его таким образом, если это еще не сделано.

3 голосов
/ 13 апреля 2010

PHP.INI

output_buffering = On
output_handler = ob_gzhandler
zlib.output_compression = Off
2 голосов
/ 05 мая 2010

Оптимизация ответа сервера (а не клиента!) С помощью кэширования и сжатия HTTP. Проверьте советы на Yahoo http://developer.yahoo.com/performance/rules.html

1 голос
/ 04 мая 2010

1 Вы можете утверждать, что ваш мыльный сервер использует сжатие gzip для содержимого http, а также вывод вашего сайта. Сводка по 0,7 с SF кажется немного длинной, либо веб-сервис долго не отвечает, либо есть большая задержка в работе. Если вы можете, попробуйте другие хостинговые компании для вашего бельгийского сервера, во Франции некоторые получили гораздо лучшую связь с США, чем другие. Мне пришлось перенести сайт с одного хоста на другой, и задержка в сети между Парижем и Нью-Йорком почти удвоилась! это ужасно, и мой клиент с большим количеством посетителей из США был недоволен этим. Решение о переносе веб-сервера на SF может быть вариантом, вы получите гораздо лучшее соединение между серверами, но будьте осторожны с задержкой, если ваши посетители в основном находятся в Европе.

2 Вы можете использовать механизм кэширования кода операции, такой как xcache или APC. Это не изменит задержки мыла, но улучшит время выполнения php.

3 В зависимости от того, повторяется ли запрос мыла и сколько времени может продлеваться обновление контента, вы можете существенно улучшить его, используя кэш результатов мыла. Я предлагаю вам использовать систему кэширования в памяти (например, xcache / memcached или другую), потому что они намного быстрее, чем система кеширования файлов или БД.

Из вашего класса метод createclient - не самая адаптированная примерная функциональность для кэширования, но для любой операции чтения это просто лучший способ выполнения:

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 (например, вывод рендеринга шаблона и другие операции использования ресурсов). Ключ к успеху с этой техникой состоит в том, чтобы точно знать, какая часть кэшируется и как долго она будет оставаться освежающей.

0 голосов
/ 07 мая 2010

Любой шанс использования интерфейса AJAX ... если запросы могут происходить в фоновом режиме, вам не придется ждать ответа.

...