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)
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);
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
.
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é.
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.
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.
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.
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.
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
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
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);
}
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.
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
.
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);
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.
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 !
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.
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
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);
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)
));
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
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/