Parfois, ne pas appeler le service Web.
Ce problème se produit 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)
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 utilisant http: //Host.local/ ).
Le comportement dans 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'expiration via le connection_timeout
option ou via default_socket_timeout
paramètre 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 l'a souligné zanlok pour réessayer plusieurs fois. Si des utilisateurs attendent réellement ces appels SOAP, alors vous voudrez les mettre en file d'attente et les traiter en arrière-plan et avertir l'utilisateur lorsqu'ils ont terminé.
il y a une section de configuration de savon dans votre fichier php.ini, qui contrôle le cache d'accès wsdl, peut être affichée comme:
[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 fichiers wsdl est activé, cela peut provoquer 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-
en dessous de /tmp
répertoire. ou vous définissez simplement soap.wsdl_cache_enabled=0;
et soap.wsdl_cache_ttl=0;
PHP récupérera le fichier wsdl à chaque fois que vous visitez la page.
Un service mal configuré quitte l'espace de noms par défaut avec tempuri.org
Cela signifie que la connexion au wsdl fonctionnera, mais l'appel de fonction échouera.
Trace de la pile:
SoapClient-> __doRequest ('http: //example.com ...', ' http://tempuri.org ....', 2, 0)
Pour y remédier, vous devez définir explicitement l'emplacement à l'aide de __setLocation()
$this->soapClient = new \SoapClient(WS_URL);
$this->soapClient->__setLocation(WS_URL);
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 moi-même rencontré ce problème et après avoir beaucoup creusé, j'ai finalement trouvé ce bogue pour ubuntu:
https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/965371
plus précisément
https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/965371/comments/62
openssl s_client -connect site.tld:443
a échoué cependant openssl s_client -tls1 -connect site.tld:443
a réussi. Dans mon cas particulier, une partie de la sortie comprenait New, TLSv1/SSLv3, Cipher is RC4-MD5
j'ai donc défini la valeur ssl/cipher du contexte php de manière appropriée.
Dans notre cas, c'était un problème de négociation Ciphers. Nous obtenions cette erreur au hasard. Nous avons résolu notre problème en forçant un chiffrement comme celui-ci:
$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 chiffres à chaque appel de service.
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)
));
Il semble que l'erreur SoapFault exception: Could not connect to Host
peut être causé par plusieurs choses différentes. Dans mon cas, cela n'a pas été causé par un proxy, un pare-feu ou un DNS (j'avais en fait une connexion SOAP de la même machine fonctionnant avec nusoap sans aucune configuration spéciale).
Enfin, j'ai trouvé que cela était dû à un fichier pem
invalide auquel j'ai fait référence dans le local_cert
option dans mon constructeur SoapClient.
Solution: Lorsque j'ai supprimé la chaîne de certificats du fichier pem
, elle uniquement contenait un certificat et une clé privée, les appels SOAP ont commencé à passer.
J'ai finalement trouvé la raison - sa raison pour laquelle la bibliothèque ne trouve pas de bundle CA sur votre système. PHP> = v5.6 définit automatiquement verify_peer sur true par défaut. Cependant, tous les systèmes n'ont pas de 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
au chemin de votre fichier CA.
2. Spécifiez manuellement l'emplacement de votre fichier SSL CA
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($cHandler, CURLOPT_CAINFO, $path-of-your-ca-file);
3. désactivé verify_peer
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
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
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 en.
<soap:address location="https://myweb.com:4460/xxx_webservices/services/ABC.ABC/"/>
Bonne chance.
Avec moi, ce problème dans l'adresse de base dans app.config du service WCF: Quand j'ai utilisé:
<baseAddresses><add baseAddress="http://127.0.0.1:9022/Service/GatewayService"/> </baseAddresses>
c'est ok si vous utilisez .net pour vous connecter avec une adresse IP ou un domaine public.
Mais lorsque vous utilisez SoapClient de PHP pour vous connecter à "http://[online ip]:9022/Service/GatewayService
", il s'agit de l'exception de lancement" Coulod ne se connecte pas à l'hôte "
J'ai changé baseAddress en [IP en ligne]: 9022 et tout va bien.
Pour moi, c'était un problème DNS. Les serveurs de noms de mon VPS ont craqué, alors je suis passé à Google en modifiant mon /etc/resolv.conf pour: nameserver 8.8.8.8 nameserver 8.8.4.4
si la solution d'ujava ne peut pas vous aider, vous pouvez essayer d'utiliser try/catch pour attraper ce fatal, cela me convient.
try{
$res = $client->__call('LineStopQueryJson',array('Parameters' => $params));
}catch(SoapFault $e){
print_r($client);
}
Pour ceux qui ont lutté comme moi avec la commande laravel artisan console qui fait beaucoup de demandes au même wsdl du serveur de savon externe, puis après un certain temps échoue avec Could not connect to Host
Erreur.
Le problème était dû au fait que je créais une nouvelle instance de SoapClient
à chaque fois avant la demande. Ne faites pas cela. Créez-le une fois et faites chaque demande auprès du même client.
J'espère que ça aide.
Juste pour aider les autres personnes qui rencontrent cette erreur, l'URL dans <soap:address location="https://some.url"/>
avait un certificat non valide et a provoqué l'erreur.
Si la connexion se fait via SSL, cela pourrait être un problème de serveur au lieu de client (c'est mon cas).
Dans PHP versions supérieures à 5.6 et 7, il est important de vérifier la CipherSuite utilisée dans le certificat de serveur. Il y a une liste complète des chiffrements autorisés par ces versions 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é (il s'agit d'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 de cela sur Internet.
Vérifiez également ceci: http://php.net/manual/en/migration56.openssl.php
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
Pour moi, c'était un problème de certificat. La suite a fonctionné pour moi
$context = stream_context_create([
'ssl' => [
// set some SSL/TLS specific options
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]);
$client = new SoapClient(null, [
'location' => 'https://...',
'uri' => '...',
'stream_context' => $context
]);
J'ai eu une mauvaise configuration de php.ini. Vérifiez le chemin et la validité du certificat ...
[openssl]
openssl.cafile = "C:/good/phpath/ca-bundle.crt"
Parce que mon nouveau\SoapClient ($ wsdl) était https!