php - the - porque no me agarra el http injector
Excepción de SoapFault: no se pudo conectar al host (21)
Conmigo, este problema en la dirección base en app.config del servicio WCF: cuando he usado:
<baseAddresses><add baseAddress="http://127.0.0.1:9022/Service/GatewayService"/> </baseAddresses>
está bien si usas .net para conectarte con IP pública o dominio.
Pero cuando utilizas SoapClient de PHP para conectarte a " http://[online ip]:9022/Service/GatewayService
", es excepción de lanzamiento "Coulod no se conecta al host"
Cambié baseAddress a [ip en línea]: 9022 y todo está bien.
A veces no se puede llamar al servicio web.
Este problema ocurre todo el tiempo.
¿Cual podría ser el problema?
Error:
SoapFault exception: [HTTP] Could not connect to host in
0 [internal function]: SoapClient->__doRequest(''<?xml version="...'', http://.'', '''', 1, 0)
El host está inactivo o muy lento para responder. Si la respuesta es lenta, puede intentar aumentar el tiempo de espera a través de la opción connection_timeout
o a través de la configuración default_socket_timeout
y ver si eso reduce las fallas.
http://www.php.net/manual/en/soapclient.soapclient.php
http://www.php.net/manual/en/filesystem.configuration.php#ini.default-socket-timeout
También puede incluir el manejo de errores, como lo señaló zanlok para volver a intentarlo varias veces. Si tiene usuarios realmente esperando estas llamadas SOAP, querrá ponerlas en cola, procesarlas en segundo plano y notificar al usuario cuando terminen.
El problema fue resuelto. El problema es el caché
ini_set(''soap.wsdl_cache_enabled'',0);
ini_set(''soap.wsdl_cache_ttl'',0);
En mi caso funcionó después de la conexión al wsdl, use la función __setLocation()
para definir la ubicación nuevamente porque la llamada falla con el error:
No se pudo conectar con el host
Esto sucede si el WSDL es diferente al especificado en SoapClient::SoapClient
.
En mi caso, la dirección del servicio en wsdl es incorrecta.
Mi wsdl url es.
https://myweb.com:4460/xxx_webservices/services/ABC.ABC?wsdl
Pero la dirección del servicio en ese resultado xml es.
<soap:address location="http://myweb.com:8080/xxx_webservices/services/ABC.ABC/"/>
Solo guardo ese xml en el archivo local y cambio la dirección del servicio a.
<soap:address location="https://myweb.com:4460/xxx_webservices/services/ABC.ABC/"/>
Buena suerte.
En nuestro caso, fue un problema de negociación de Cifrado. Estábamos obteniendo este error al azar. Solucionamos nuestro problema forzando un Cipher como este:
$soapClient = new SoapClient(''http://example.com/soap.asmx?wsdl'',array("stream_context" => stream_context_create(array(''ssl'' => array(''ciphers''=>''AES256-SHA'')))));
Parece que PHP no estaba negociando los mismos Cifrados en cada llamada de servicio.
Eso probablemente se refiere a un problema de conexión. Podría ser que tu conexión a Internet no funciona o que el servicio web que intentas utilizar está fuera de servicio. Sugiero usar este servicio para ver si el servicio web está en línea o no: http://downforeveryoneorjustme.com/
Este trabajo para mí
$opts = array(
''ssl'' => array(''verify_peer'' => false, ''verify_peer_name'' => false)
);
if (!isset($this->soap_client)) {
$this->soap_client = new SoapClient($this->WSDL, array(
''soap_version'' => $this->soap_version,
''location'' => $this->URL,
''trace'' => 1,
''exceptions'' => 0,
''stream_context'' => stream_context_create($opts)
));
Estoy agregando mi comentario para que esté completo, ya que las soluciones que figuran aquí no me ayudaron. En PHP 5.6, SoapClient realiza la primera llamada al URL WSDL especificado en SoapClient::SoapClient
y luego de conectarse y recibir el resultado, intenta conectarse al WSDL especificado en el resultado en:
<soap:address location="http://"/>
Y la llamada falla con el error Could not connect to host
si el WSDL es diferente al que especificó en SoapClient::SoapClient
y no está disponible (mi caso fue SoapUI usando http://host.local/ ).
El comportamiento en PHP 5.4 es diferente y siempre usa WSDL en SoapClient::SoapClient
.
Finalmente encontré el motivo, ya que la biblioteca no puede encontrar un paquete de CA en su sistema. PHP> = v5.6 establece automáticamente verify_peer en true de forma predeterminada. Sin embargo, no todos los sistemas tienen un paquete de CA conocido en el disco.
Puedes probar uno de estos procedimientos:
1.Si tiene un archivo CA en su sistema, establezca openssl.cafile
o curl.cainfo
en su php.ini
en la ruta de su archivo CA.
2. Especifique manualmente la ubicación de su archivo CA de SSL
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($cHandler, CURLOPT_CAINFO, $path-of-your-ca-file);
3.disabled verify_peer
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Llegué a este tema yo mismo y después de mucho investigar finalmente encontré este error para ubuntu:
https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/965371
específicamente
https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/965371/comments/62
openssl s_client -connect site.tld:443
falló sin embargo openssl s_client -tls1 -connect site.tld:443
dio éxito. En mi caso particular, parte de la salida incluía New, TLSv1/SSLv3, Cipher is RC4-MD5
así que configuré el valor ssl / cipher del contexto php de manera apropiada.
Para mí fue un problema de DNS. Los servidores de nombres de mi VPS fueron eliminados, así que cambié a Google editando mi /etc/resolv.conf para que sea: nameserver 8.8.8.8 nameserver 8.8.4.4
Para mí, esto fue un problema en el servicio httpd
(Fedora 24). Un simple reinicio hizo el truco:
sudo service httpd restart
Parece que el error SoapFault exception: Could not connect to host
puede ser causado por varias cosas diferentes. En mi carcasa no fue causada por proxy, firewall o DNS (en realidad tenía una conexión SOAP desde la misma máquina que funcionaba usando nusoap sin ninguna configuración especial).
Finalmente encontré que fue causado por un archivo de pem
no pem
que hice referencia en la opción local_cert
en mi contructor de SoapClient.
Solución: cuando pem
la cadena de certificados del archivo pem
, por lo que solo contenía certificado y clave privada, las llamadas SOAP comenzaron a pem
.
Si la conexión es a través de SSL, podría ser un problema de servidor en lugar de cliente (es mi caso).
En las versiones de PHP mayores que 5.6 y 7, es importante verificar el CipherSuite utilizado en el certificado del servidor. Hay una lista completa de cifrados permitidos por estas versiones y una lista completa de cifrados que no aparecen en este enlace web: https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Ciphersuite
Si el cifrado utilizado no está permitido (es un algoritmo obsoleto), SoapClient recibe "No se pudo conectar al host" y no hay más rastros al respecto.
El cifrado utilizado puede ser verificado por clientes como SoapUI en la sección de "SSL Info", por ejemplo.
No hay un foro de discusión tratando esto en internet.
Mira esto, también: http://php.net/manual/en/migration56.openssl.php
Si la solución de ujava no puede ayudarte, puedes intentar usar try / catch para atrapar a este fatal, esto funciona bien para mí.
try{
$res = $client->__call(''LineStopQueryJson'',array(''Parameters'' => $params));
}catch(SoapFault $e){
print_r($client);
}
Si tiene un firewall en su servidor, asegúrese de abrir el puerto utilizado por SOAP.
En mi caso, tuve que abrir el puerto 1664.
iptables -t filter -A INPUT -p tcp --dport 1664 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 1664 -j ACCEPT
Solo para ayudar a otras personas que encuentran este error, la url en <soap:address location="https://some.url"/>
tenía un certificado inválido y causaba el error.
Tuve una mala configuración de php.ini. Verificar la ruta y la validez del certificado ...
[openssl]
openssl.cafile = "C:/good/phpath/ca-bundle.crt"
Porque mi nuevo / SoapClient ($ wsdl) era https!
Un servicio misconfigured deja el espacio de nombres predeterminado con tempuri.org
Esto significa que la conexión al wsdl funcionará, pero la llamada a la función fallará.
Stacktrace:
SoapClient-> __doRequest (''http: //example.com ...'', '' http://tempuri.org ....'', 2, 0)
Para remediar esto, debe establecer explícitamente la ubicación usando __setLocation()
$this->soapClient = new /SoapClient(WS_URL);
$this->soapClient->__setLocation(WS_URL);
hay una sección de configuración de soap en su archivo php.ini, que controla el caché de acceso wsdl, se puede mostrar como:
[soap]
; Enables or disables WSDL caching feature.
soap.wsdl_cache_enabled=1 ;
Sets the directory name where SOAP extension will put cache files.
soap.wsdl_cache_dir="/tmp"
; (time to live) Sets the number of second while cached file will be used ; instead of original one.
soap.wsdl_cache_ttl=86400
si la memoria caché de archivos wsdl está habilitada, puede causar este problema al cambiar el URI wsdl en el código php. en este ejemplo, puede simplemente eliminar el archivo con el wsdl-
under /tmp
. o simplemente establece soap.wsdl_cache_enabled=0;
y soap.wsdl_cache_ttl=0;
PHP buscará el archivo wsdl cada vez que visite la página.