2011-01-28 10 views
14

Recibo la siguiente excepción en mi página php.Excepción de SoapFault: error [HTTP] Recuperar encabezados http

SoapFault excepción: [HTTP] error al obtener las cabeceras http

leí par de artículo y encontraron que default_socket_timeout necesita configuración. así que lo configuré como sigue. default_socket_timeout = 480

Sigo recibiendo el mismo error. ¿Alguien me puede ayudar?

Respuesta

-9

Uno de mis procesos dentro del servicio web estaba tardando mucho tiempo en ejecutarse. Por lo tanto, recibí una excepción de excepción de soap.

+1

¿Y usted soluciona esto? Estoy intentando aumentar el tiempo de espera, pero no ayuda :(Gracias – Dmitriy

+2

Esto realmente no responde a la pregunta. – Jeff

29

he estado recibiendo Error fetching http headers por dos razones:

  1. El servidor toma mucho tiempo para responder.
  2. El servidor no es compatible con las conexiones Keep-Alive (que cubre mi respuesta).

PHP siempre intentará utilizar una conexión persistente al servicio web enviando el Connection: Keep-Alive encabezado HTTP. Si el servidor siempre cierra la conexión y no lo ha hecho (PHP no ha recibido EOF), puede obtener Error fetching http headers cuando PHP intente reutilizar la conexión que ya está cerrada en el servidor.

Nota: este escenario solo ocurrirá si el mismo objeto SoapClient envía más de una solicitud y con una alta frecuencia. El envío de Connection: close encabezado HTTP junto con la primera solicitud lo habría arreglado.

En PHP versión 5.3.5 (actualmente entregado con Ubuntu), SoapClient no admite el encabezado HTTP Connection: Close. Uno debe ser capaz de enviar en la cabecera HTTP en un contexto de secuencia (utilizando el $option - stream_context clave como argumento para SoapClient), pero SoapClient does not support changing the Connection header (Actualización: Este error se soluciona en PHP versión 5.3.11).

Otra solución es implement your own __doRequest(). En el enlace proporcionado, un chico usa Curl para enviar la solicitud. Esto hará que su aplicación PHP dependa de Curl. La implementación también pierde funcionalidades como guardar encabezados de solicitud/respuesta.

Una tercera solución es cerrar la conexión justo después de recibir la respuesta. Esto puede hacerse configurando el atributo SoapClients httpsocket en NULL en __doRequest(), __call() o __soapCall(). Ejemplo con __call():

class MySoapClient extends SoapClient { 
    function __call ($function_name , $arguments) { 
     $response = parent::__call ($function_name , $arguments); 
     $this->httpsocket = NULL; 
     return $response; 
    } 
} 
+9

Desde PHP 5.4 este indicador ya está disponible: La opción keep_alive es un valor booleano que define si enviar la conexión: Cabecera o conexión de Keep-Alive: cerrar. (Http://www.php.net/manual/en/soapclient.soapclient.php) – heuri

+0

Parece una pena que se deba apagar el keepalive para evitar esto; puedo estar malentendiendo cosas, pero ¿la respuesta del servidor no debería indicar cuánto tiempo se puede mantener viva la conexión y luego el SoapClient debería saber que no volverá a usarla después de que se agote el tiempo de espera (e, idealmente, se vuelva a conectar de forma transparente)? ​​ –

+0

"El servidor no es compatible Las conexiones de Keep-Alive (que cubre mi respuesta). "Tenía un servidor de errores con el que estaba hablando. No manejaba correctamente las conexiones Keep-Alive y tuve que apagarlo. – HNygard

1

que tenían el mismo problema y trataron de la siguiente mediante la desactivación de keep_alive.

$api_proxy = new SoapClient($api_url, array('trace' => true, 'keep_alive' => false)); 

Sin embargo, eso no funcionó para mí. Lo que funcionó funcionó para mí fue deshabilitar el caché SOAP.Parece que ha estado almacenando en caché las solicitudes incorrectas y, después de desactivarlas, noté que mis solicitudes se ejecutaban más rápido.

En un servidor Linux, puede encontrarlo en su archivo /etc/php.ini.

Busque soap.wsdl_cache_enabled=1 y cámbielo a soap.wsdl_cache_enabled=0.

No olvide cargar el apache. service httpd reload

Cuestiones relacionadas