he estado recibiendo Error fetching http headers
por dos razones:
- El servidor toma mucho tiempo para responder.
- 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;
}
}
¿Y usted soluciona esto? Estoy intentando aumentar el tiempo de espera, pero no ayuda :(Gracias – Dmitriy
Esto realmente no responde a la pregunta. – Jeff