Exception SoapFault: impossible de se connecter à l'hôte

Parfois ne parviennent pas à appeler le service web.

Ce problème arrive tout le temps.

Quel pourrait être le problème?

Error:
    SoapFault exception: [HTTP] Could not connect to host in 
    0 [internal function]: SoapClient->__doRequest('<?xml version="...', http://.', '', 1, 0)
26
demandé sur ujava 2010-12-01 00:29:22

21 réponses

Le problème a été résolu.Le problème est le cache

ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);
25
répondu ujava 2010-12-01 11:25:53

J'ajoute mon commentaire pour être complet, car les solutions énumérées ici ne m'ont pas aidé. Sur PHP 5.6, SoapClient effectue le premier appel à l'URL WSDL spécifiée dans SoapClient::SoapClient et après s'y être connecté et avoir reçu le résultat, il essaie de se connecter au WSDL spécifié dans le résultat dans:

<soap:address location="http://"/>

Et l'appel échoue avec l'erreur Could not connect to host si le WSDL est différent de celui que vous avez spécifié dans SoapClient::SoapClient et est inaccessible (mon cas était SoapUI en utilisant http://host.local/).

Le le comportement en PHP 5.4 est différent et il utilise toujours le WSDL dans SoapClient::SoapClient.

15
répondu VolenD 2014-12-04 15:51:11

L'hôte est en panne ou très lent à répondre. S'il est lent à répondre, vous pouvez essayer d'augmenter le délai d'attente via l'option connection_timeout ou via le paramètre default_socket_timeout et voir si cela réduit les échecs.

Http://www.php.net/manual/en/soapclient.soapclient.php

Http://www.php.net/manual/en/filesystem.configuration.php#ini.default-socket-timeout

Vous pouvez également inclure la gestion des erreurs comme zanlok l'a souligné pour réessayer quelques fois. Si vous avez des utilisateurs en fait, en attendant ces appels SOAP, vous voudrez les mettre en file d'attente et les traiter en arrière-plan et informer l'utilisateur lorsqu'ils ont terminé.

12
répondu Rob Olmos 2010-11-30 22:23:56

Il y a une section de configuration soap dans votre php.le fichier ini, qui contrôle le cache d'accès wsdl, peut être affiché comme suit:

[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 le cache de fichier wsdl est activé, cela peut causer ce problème lors de la modification de l'URI wsdl dans le code php. dans cet exemple, vous pouvez simplement supprimer le début du fichier avec wsdl- sous le répertoire /tmp. ou vous venez de définir soap.wsdl_cache_enabled=0; et soap.wsdl_cache_ttl=0; PHP va récupérer le fichier wsdl chaque fois que vous visitez la page.

7
répondu curzduff 2012-10-25 08:42:51

J'ai frappé ce problème moi-même et après beaucoup de recherches, j'ai finalement trouvé ce bug pour ubuntu:

Https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/965371

Spécifiquement

Https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/965371/commentaires/62

openssl s_client -connect site.tld:443 échoué cependant openssl s_client -tls1 -connect site.tld:443 a donné le succès. Dans mon cas particulier une partie de la sortie incluse New, TLSv1/SSLv3, Cipher is RC4-MD5 j'ai donc défini la valeur ssl/cipher du contexte php de manière appropriée.

4
répondu Travis Hansen 2013-01-09 03:59:33

Il semble que l'erreur SoapFault exception: Could not connect to host peut être causée par plusieurs choses différentes. Dans mon boîtier, il n'était pas causé par un proxy, un pare-feu ou un DNS (j'avais en fait une connexion SOAP de la même machine fonctionnant en utilisant nusoap sans aucune configuration spéciale).

Enfin, j'ai trouvé qu'il était causé par un fichier pem invalide que j'ai référencé dans l'option local_cert dans mon contructor SoapClient.

Solution: Quand j'ai supprimé la chaîne de certificat du fichier pem, donc seulement contenant le certificat et la clé privée, les appels SOAP ont commencé à passer.

2
répondu Jacob 2014-10-30 14:58:11

Dans notre cas, c'était un problème de négociation de chiffrement. Nous obtenions cette erreur au hasard. Nous avons résolu notre problmem en forçant un chiffrement comme ceci:

$soapClient = new SoapClient('http://example.com/soap.asmx?wsdl',array("stream_context" => stream_context_create(array('ssl' => array('ciphers'=>'AES256-SHA')))));

On dirait que PHP ne négociait pas les mêmes chiffrements à chaque appel de service.

2
répondu MaxP 2017-01-31 16:27:32

Pour moi, c'était un problème DNS. Les serveurs de noms de mon VPS ont chié, alors je suis passé à Google en éditant mon/etc / resolv.conf pour être: serveur de noms 8.8.8.8 serveur de noms 8.8.4.4

1
répondu David Hadaller 2011-05-05 21:24:11

Si vous avez un pare-feu sur votre serveur, Assurez-vous d'ouvrir le port utilisé par SOAP.

Dans mon cas, j'ai dû ouvrir le port 1664.

iptables -t filter -A INPUT -p tcp --dport 1664 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 1664 -j ACCEPT
1
répondu Nicolas BADIA 2012-06-26 10:44:21

Si la solution d'ujava ne peut pas vous aider, vous pouvez essayer d'utiliser try / catch pour attraper ce fatal, cela fonctionne bien sur moi.

try{
    $res = $client->__call('LineStopQueryJson',array('Parameters' => $params));
}catch(SoapFault $e){
    print_r($client);
}
1
répondu pan7an 2013-04-11 06:25:25

Avec moi, ce problème dans l'adresse de base dans l'application.configuration du service WCF: Quand j'ai utilisé:

<baseAddresses><add baseAddress="http://127.0.0.1:9022/Service/GatewayService"/> </baseAddresses>

C'est ok si utiliser. Net pour se connecter avec ip publique ou domaine.

Mais lorsque vous utilisez le SoapClient de PHP pour vous connecter à " http://[online ip]:9022/Service/GatewayService", c'est l'exception throw "Coulod not connect to host"

J'ai changé baseAddress en [IP en ligne]: 9022 et tout va bien.

1
répondu Nesaver 2016-05-16 18:18:55

Dans mon cas, cela a fonctionné après la connexion au wsdl, utilisez la fonction __setLocation() pour définir à nouveau l'emplacement car l'appel échoue avec l'erreur:

Impossible de se connecter à l'hôte

Cela se produit si le WSDL est différent de celui spécifié dans SoapClient::SoapClient.

1
répondu Julian Duque Mejía 2017-11-03 13:26:45

J'ai finalement trouvé la raison: c'est parce que la bibliothèque ne peut pas trouver un paquet de CA sur votre système. PHP > = V5.6 définit automatiquement verify_peer à true par défaut. Cependant, tous les systèmes n'ont pas un bundle CA connu sur le disque .

, Vous pouvez essayer l'une de ces procédures:

1.Si vous avez un fichier CA sur votre système, définissez openssl.cafile ou curl.cainfo dans votre php.ini sur le chemin de votre fichier CA.

2.Spécifiez manuellement l'emplacement de votre fichier CA SSL

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);  
curl_setopt($cHandler, CURLOPT_CAINFO, $path-of-your-ca-file);

3.désactivée verify_peer

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
1
répondu Tianya Lan 2017-12-12 04:22:17

Dans mon cas, l'adresse de service dans wsdl est incorrecte.

Mon url wsdl est.

Https://myweb.com:4460/xxx_webservices/services/ABC.ABC?wsdl

Mais l'adresse de service dans ce résultat xml est.

<soap:address location="http://myweb.com:8080/xxx_webservices/services/ABC.ABC/"/>

Je viens d'enregistrer ce xml dans un fichier local et de changer l'adresse du service.

<soap:address location="https://myweb.com:4460/xxx_webservices/services/ABC.ABC/"/>

Bonne chance.

0
répondu Panusit 2015-06-12 08:55:43

J'ai eu un mauvais php.ini de configuration. Vérifiez le chemin d'accès et la validité du certificat...

[openssl]
openssl.cafile = "C:/good/phpath/ca-bundle.crt"

Parce que mon nouveau \ SoapClient ($wsdl) était https !

0
répondu François Breton 2015-11-27 16:28:30

Juste pour aider les autres personnes qui rencontrent cette erreur, l'url dans <soap:address location="https://some.url"/> avait un certificat invalide et a causé l'erreur.

0
répondu Cas van Noort 2016-11-21 09:06:40

Pour moi, c'était un problème dans le service httpd (Fedora 24). Un simple redémarrage a fait l'affaire:

sudo service httpd restart
0
répondu hlscalon 2017-07-14 11:58:12

Un servicemal configuré laisse l'espace de noms par défaut avec tempuri.org

Cela signifie que la connexion au wsdl fonctionnera, mais l'appel de fonction échouera.

Stacktrace:

SoapClient->__doRequest('http://example.com...', 'http://tempuri.org....', 2, 0)

Pour remédier à cela, vous devez définir explicitement l'emplacement en utilisant __setLocation()

$this->soapClient = new \SoapClient(WS_URL);
$this->soapClient->__setLocation(WS_URL);
0
répondu MediaFormat 2018-05-08 13:42:32

Ce travail pour moi

$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)
  ));
0
répondu Juan Martín Pagella 2018-05-13 20:40:50

Si la connexion est via SSL, pourrait être un problème de serveur au lieu de client (c'est mon cas).

Dans les versions PHP supérieures à 5.6 et 7, Il est important de vérifier le CipherSuite utilisé dans le certificat du serveur. Il y a une liste complète des chiffrements autorisés par cette version et une liste complète des chiffrements qui ne le font pas dans ce lien web: https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Ciphersuite

Si le chiffrement utilisé n'est pas autorisé (c'est un algorithme obsolète), SoapClient reçoit "impossible de se connecter à l'hôte" et il n'y a plus de trace à ce sujet.

Le chiffrement utilisé peut être vérifié par des clients comme SoapUI dans la section "SSL Info", par exemple.

Il n'y a pas de forum de discussion traitant à ce sujet dans internet.

Vérifiez cela aussi: http://php.net/manual/en/migration56.openssl.php

0
répondu Zelkovar 2018-07-05 10:30:00

Qui fait très probablement référence à un problème de connexion. Il se peut que votre connexion internet soit en panne ou que le service web que vous essayez d'utiliser soit en panne. Je suggère d'utiliser ce service pour voir si le service web est en ligne ou non: http://downforeveryoneorjustme.com/

-7
répondu Click Upvote 2010-11-30 22:28:14