Ускорение мыла привело в действие веб-сайт

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

Наш веб-сайт является приводимым в действие PHP, с помощью PHP's, созданного в классе SoapClient. В среднем вызов к веб-сервису занимает 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;
}
5
задан hakre 2 January 2013 в 18:44
поделиться

6 ответов

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

  • Если вы отвечаете за веб-службы, вы можете создать специализированные веб-службы, которые выполняют несколько операций одновременно, так что ваше основное приложение может выполнять только один запрос на страницу.
  • Если нет, вы можете переместить свой сервер приложений рядом с Сан-Франциско.
  • Если перемещение всего сервера невозможно, и вы не можете создавать новые специализированные веб-сервисы, вы можете добавить мост, расположенный рядом с сервером веб-сервисов. Этот мост будет предоставлять специализированные веб-сервисы и отвечать за вызов атомных веб-сервисов. Например, вместо 0,7 с * 5 у вас будет 0,7 с + 5 * 0,1.
5
ответ дан 18 December 2019 в 14:43
поделиться

PHP.INI

output_buffering = On
output_handler = ob_gzhandler
zlib.output_compression = Off
3
ответ дан 18 December 2019 в 14:43
поделиться

Вы точно знаете, что именно сетевая задержка замедляет каждый запрос? 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, preransfer_time, starttransfer_time и redirect_time. Из них вы сможете определить, что занимает время: dns, запрос, сам мыльный сервер или ответ.

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

3
ответ дан 18 December 2019 в 14:43
поделиться

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

2
ответ дан 18 December 2019 в 14:43
поделиться

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

-1
ответ дан 18 December 2019 в 14:43
поделиться

1 Вы можете утверждать, что ваш сервер SOAP использует сжатие gzip для http-контента, как и выходные данные вашего сайта. Обращение к SF за 0,7 секунды кажется немного длинным: либо веб-сервис долго не отвечает, либо существует важная задержка при работе. Если вы можете, попробуйте другие хостинговые компании для вашего сервера в Бельгии, в У некоторых из Франции связь с США намного лучше, чем у других. Мне пришлось перенести веб-сайт с одного хоста на другой, и задержка в сети между Парижем и Нью-Йорком почти удвоилась! это угэ, и мой клиент с большим количеством посетителей из США был недоволен этим. Перемещение веб-сервера в 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 (например, вывода вывода шаблона и других операций по использованию ресурсов). Ключ к успеху этой техники - точно знать, какая часть кэшируется и как долго она будет оставаться без обновления.

1
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: