Pregunta

Actualmente se encuentra en hacer algunos ajustes de rendimiento en un sitio web que se basa en gran medida en un servicio web SOAP. Pero ... nuestros servidores están ubicados en Bélgica y el servicio web que nos conectamos a es localizar en San Francisco, así que es una conexión de larga distancia por decir lo menos.

Nuestro sitio web está alimentado PHP, usando PHP incorporado en la clase SoapClient. En promedio una llamada al servicio web tarda 0,7 segundos y estamos haciendo acerca de 3-5 solicitudes por página. Todas las posibles petición / respuesta de almacenamiento en caché ya está implementado de manera ahora estamos buscando otras maneras de mejorar la velocidad de la conexión.

Este es el código que crea una instancia del SoapClient, lo que estoy buscando ahora es otros modos / métodos para mejorar la velocidad de requestes individuales. Cualquier persona tiene o sugerencias de idea?

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;
}
¿Fue útil?

Solución

Por lo tanto, la raíz del problema es el número de pedido que tiene que hacer. ¿Qué pasa con la creación de servicios agrupados?

  • Si usted está a cargo de los servicios web, puede crear servicios web que hacen varias operaciones al mismo tiempo especializada por lo que su aplicación principal, justo puede hacer una solicitud por página.
  • Si no se puede trasladar el servidor de aplicación cerca de San Francisco.
  • Si la reubicación de todo el servidor no es posible y que no puede crear nuevos servicios web especializados, podría agregar un puente, situado cerca del servidor de servicios web. Este puente se proporcionan los servicios web especializados y se encargará de llamar a los servicios web atómicas. En vez de 0,7 segundos * 5 tendría 0.7s + 5 * 0.1 por ejemplo.

Otros consejos

PHP.INI

output_buffering = On
output_handler = ob_gzhandler
zlib.output_compression = Off

¿Usted sabe con certeza que es la latencia de la red ralentizar cada solicitud? 0.7s parece un largo tiempo de vuelta, como dice Benoit. Me vería en hacer un poco de evaluación comparativa -. Usted puede hacer esto con rizo, aunque no estoy seguro de cómo esto funcionaría con su cliente jabón

Algo así como:

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

$info devolverá una matriz que incluye elementos para total_time, namelookup_time, connect_time, pretransfer_time, starttransfer_time y redirect_time. A partir de estos debe ser capaz de averiguar si se trata de nombres de dominio, solicitud, el servidor de jabón real o la respuesta que está teniendo hasta el momento.

Una cosa obvia que se me acaba de ocurrir que se están solicitando al servidor SOAP a través de un dominio o una dirección IP? Si estás utilizando un dominio, DNS podrían frenar las cosas de manera significativa (aunque se almacenan en caché en varias etapas). Verifique la hora del DNS local (en su cliente de jabón o php.ini - no estoy seguro) y el TTL de su dominio (en su zona DNS). Configurar una dirección IP estática para el servidor de Sanfran y hacer referencia a ella de esa manera si no está ya.

Optimizar los servidores (no el cliente!) Respuesta HTTP mediante el uso de almacenamiento en caché y la compresión HTTP. Echa un vistazo a los consejos de yahoo http://developer.yahoo.com/performance/rules.html

1 Se puede afirmar que su uso del servidor de compresión gzip jabón para http contenidos, así como su salida sitio hace. Un resumen 0,7s a SF parece un poco largo, que es ya sea servicio web es tiempo para responder, o bien hay un importante latencia natwork. Si es posible, darle una oportunidad a otras empresas de alojamiento de su servidor de Bélgica, en Francia algunos llegaron una mejor conectividad con los EE.UU. que otros. Experimenté para mover un sitio web desde un host o la otra y la latencia de red entre París y Nueva York casi se ha duplicado! que de la UGE y mi cliente con una gran cantidad de visitantes de Estados Unidos no estaba contento con él. La solución de la reubicación del servidor web para SF puede ser una opción, obtendrá una mejor conectividad entre los servidores, pero tenga cuidado de latencia si sus visitantes se encuentran principalmente en Europa.

2 Puede utilizar una caché MECANISMO código de operación, tales como XCache o APC. No Wil cambiar la latencia de jabón, pero mejorará el tiempo de ejecución de PHP.

3, dependiendo si la solicitud de jabón son repetitivas, y cuánto tiempo podrían una actualización de contenido podrían extenderse, puede darle una mejora real utilizando caché en los resultados de jabón. Sugiero que usted utilice el sistema de almacenamiento en caché en memoria (como XCache / memcached o de otro tipo) porque son ay mucho más rápido que el archivo o el sistema de caché de base de datos.

A partir de su clase, el método createClient no es la funcionalidad exemple más adaptado para ser almacenado en caché, pero para cualquier operación de lectura es simplemente la mejor manera de Potencia:

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);
}

El ejemplo es para XCache extensión, pero se pueden utilizar otros sistemas de una manera muy similar

4 Para ir más allá, puede utilizar MECANISMO similar a almacenar en caché los resultados del procesamiento de php (como salida de plantilla de renderización y otras operaciones ressource consumming). La clave del éxito con esta técnica es saber exactamente parte wich se almacena en caché y por cuánto tiempo permanecerá refrescante withous.

Hay alguna posibilidad de utilizar una interfaz AJAX .. si, no se parecerán a quedar a la espera de la respuesta de las peticiones puede estar sucediendo en el fondo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top