soapcall - soapclient php parameters
Error al buscar encabezados http en SoapClient (11)
Intento invocar un WS sobre https en un host remoto: puerto remoto y obtengo:
Error al recuperar las cabeceras http
usando PHP5 SoapClient; Puedo obtener la lista de funciones haciendo $client->__getFunctions()
pero cuando llamo $client->myFunction(...)
siempre obtengo este error.
Busqué en Google y descubrí que aumenta default_socket_timeout en php.ini, pero no funcionó.
¿Alguien puede sugerirme una solución?
EDITAR: aquí está el código:
$wsdl="myWSDL";
$client = new SoapClient($wsdl,array(''connection_timeout''=>5,''trace''=>true,''soap_version''=>SOAP_1_2));
var_dump($client->__getFunctions());
try {
$response=$client->myFunction("1","2","3");
} catch (SoapFault $fault) {
var_dump($fault);
}
}
... siempre en falta.
Enfrenté el mismo problema e intenté con la solución anterior. Tristemente, nada funciona.
- Tiempo de espera del zócalo (no funcionó)
- Agente de usuario (no trabajado)
- Configuración de SoapClient, cache_wsdl y Keep-Alive, etc.
Todo este juego de encabezados que estamos pasando. Resolví mi problema al agregar la propiedad del encabezado de compresión . Esto realmente requiere cuando esperas respuesta en formato comprimido gzip .
//set the Headers of Soap Client.
$client = new SoapClient($wsdlUrl, array(
''trace'' => true,
''keep_alive'' => true,
''connection_timeout'' => 5000,
''cache_wsdl'' => WSDL_CACHE_NONE,
''compression'' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | SOAP_COMPRESSION_DEFLATE,
));
Espero eso ayude.
Buena suerte.
Este error se ve a menudo cuando se excede el valor default_socket_timeout
para la respuesta SOAP. ( Ver este enlace )
Nota del constructor de SoapClient: la opción connection_timeout
se usa para definir un valor de tiempo de espera para conectarse al servicio, no para el tiempo de espera de su respuesta.
Puedes aumentarlo así:
ini_set(''default_socket_timeout'', 600); // or whatever new value you want
Tenga en cuenta que no debe utilizar esto como una solución permanente , sino más bien para ver si elimina el error antes de continuar investigando por qué el servicio SOAP está respondiendo tan lentamente. Si el servicio es consistentemente lento, es posible que tenga que considerar el procesamiento fuera de línea / por lotes.
La configuración que me ha funcionado fue definir en mi script php los siguientes parámetros:
ini_set(''default_socket_timeout'', 5000);
$client = new /SoapClient($url,array(
''trace'' =>true,
''connection_timeout'' => 5000,
''cache_wsdl'' => WSDL_CACHE_NONE,
''keep_alive'' => false,
));
Por favor comenta.
La definición de parámetro más importante, según mi experiencia con este tema fue
ini_set(''default_socket_timeout'', 5000);
Durante mis pruebas, he definido default_socket_timeout en 5 segundos y el error "Error Fetching http headers" se ha generado de forma instantánea.
¡Espero que te ayude!
Ninguna de las técnicas anteriores funcionó para mí.
Cuando analicé el encabezado de solicitud de __getLastRequestHeaders, vi lo siguiente:
POST /index.php/api/index/index/?SID=012345 HTTP/1.1 Host: www.XYZ.com
La URL de la API que había estado usando era diferente, como www.ABC.com. Cambié la URL de la API a www.XYZ.com/index.php/api?wsdl, y luego funcionó.
Ambas URL devolvieron el mismo WSDL del mismo servidor, pero solo uno permitió el inicio de sesión.
Solo quería agregar, para completar, que similar a Manachi, recibí este mensaje porque el certificado del cliente que estaba usando requería una frase de contraseña y, accidentalmente, tenía un carácter adicional al final de la frase de contraseña. Esta publicación es solo para ofrecer otra sugerencia acerca de qué buscar. Si el host requiere el uso de un certificado de cliente (a través del parámetro local_cert), asegúrese de proporcionar la ruta de acceso correcta al certificado y la frase de contraseña correcta (si es necesario). Si no lo hace, es muy probable que vea este mismo mensaje de error.
Solo quería compartir la solución a este problema en mi situación específica (tenía síntomas idénticos). En mi caso, resultó que ya no se confiaba en el certificado SSL proporcionado por el servicio web. En realidad, resultó ser debido a un nuevo firewall que el cliente había instalado y que estaba interfiriendo con la solicitud SOAP, pero el resultado final fue que el certificado no se estaba sirviendo / confiando correctamente.
Fue un poco difícil de rastrear porque la llamada de SoapClient (incluso con trace = 1) no proporciona comentarios muy útiles.
Pude probar el certificado no confiable usando:
openssl s_client -connect <web service host>:<port>
Sé que esta no será la respuesta al problema de todos, pero espero que ayude a alguien. De cualquier manera, creo que es importante darse cuenta de que la causa de este error (código de error: "HTTP" faultstring: "Error al obtener encabezados http") suele ser un problema de red / socket / protocolo / comunicación en lugar de simplemente "no permitir suficiente" tiempo para la solicitud ". No me puedo imaginar que expandir el valor de default_socket_timeout va a resolver este problema muy a menudo, y aunque lo haga, seguramente sería mejor resolver el problema de POR QUÉ es tan lento en primer lugar.
Supongo que es demasiado tarde, pero tengo el mismo problema. Intento el tiempo de espera del socket, pero no funciona. Mi problema era que el cliente y el servidor estaban en el mismo servidor físico. Con el código del cliente trabajando en el mismo servidor físico, recibo este error, pero, con el mismo código de cliente movido a mi servidor local, solicitando el servidor (el cliente y el servidor se ejecutaron en dos mechines diferentes) todo funciona bien.
¡Tal vez eso pueda ayudar a alguien más!
Tuve el mismo problema e intenté lo siguiente al deshabilitar 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 encontrar esto en su archivo /etc/php.ini
.
Busque soap.wsdl_cache_enabled=1
y cámbielo a soap.wsdl_cache_enabled=0
.
No te olvides de volver a cargar apache. service httpd reload
Tuve este problema y lo revisé, y en mi caso, fue el cortafuegos. El PHP no muestra el error correctamente. Para realizar la solicitud, el Firewall respondió:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
...
<html
...
<h1>Direct Access IP is not allowed</h1>
...
</html>
SoapClient espera el sobre SOAP pero recibe un código HTML. Es por eso que PHP responde con: "Error al obtener Http Headers" porque no puede entender lo que recibió en respuesta. Para resolver el problema, póngase en contacto con su administrador de red para verificar si hay algún servidor de seguridad, NAT o proxy interponiéndose en el camino y luego pídales que hagan los arreglos necesarios.
Verifique la respuesta HTTP-Header. En mi caso, el siguiente encabezado se estableció en el sitio de la API:
<IfModule mod_headers.c>
Header set Connection keep-alive
</IfModule>
Parece que PHP SoapClient no puede manejar esa opción. Como resultado, el cuerpo de respuesta estaba vacío, pero la longitud del contenido en el encabezado de respuesta se ha configurado correctamente.
Eliminar esa línea o cambiarla para "cerrar" resolvió mi problema.
''keep_alive''
funcionó para mí:
new SoapClient($api_url, array(''keep_alive'' => false));