PHP SoapClient: type soapfault exception ne Pouvait pas se connecter à l'hôte
à l'aide de ce code que j'ai fabriquer du savon demandes
$client = new SoapClient('http://example.com/soap/wsdl');
try {
$result = $client->myMethod();
} catch (Exception $e) {
echo $e->getMessage();
}
Parfois (une fois sur dix), une exception est levée:
Exception de type soapfault: [HTTP] impossible de se connecter à l'hôte
Mes tentatives
1) j'ai cherché des solutions, et J'ai lu que ce problème peut être causé par le cache wsdl, j'ai désactivé dans php.ini
:
soap.wsdl_cache_enabled = 0
soap.wsdl_cache_ttl = 0
soulève moins d'exceptions
2) j'ai essayé d'ajouter à l'hôte de windows (ils sont sur windows) la résolution du dns dans windows/system32/drivers/etc/hosts
:
160.XX.XXX.XX example.com
soulève moins d'exceptions
3) j'ai aussi essayé de désactiver le Pare-feu Windows",
soulève moins d'exceptions
4) j'ai aussi essayé d'augmenter le default_socket_timeout en php.ini
default_socket_timeout = 90
rien n'a changé
La question
Le serveur soap ne semblent pas avoir de problèmes.Il est utilisé sans problèmes également à partir d'autres sites. Est-il autre chose que je peux faire?
Mes paramètres
PHP 5.6
Apache 2.4
Windows Server 2012
Mise à JOUR
Après de nombreux tests, je pense que le problème est dans le réseau, le serveur soap est derrière un proxy inverse, le problème apparaît dans le proxy.
oui, je change ma question pour la rendre plus claire
Peut-être que cela aidera stackoverflow.com/questions/4318870/...
Vous avez un logiciel antivirus? Il semble être un problème de réseau, de sorte que vous pouvez mettre dans le
catch
un autre SoapClient
essayer et voir si elle échoue. Si vous avez un autre serveur dans le même réseau, vous pouvez essayer de faire la même requête SOAP de voir ce qui se passe.Il se pourrait que la durée de vie n'est pas dépassée. De vérifier la remarque concernant le cache WSDL dans la doc: php.net/manual/en/soapclient.soapclient.php. Fondamentalement changer le réglage n'a aucun effet jusqu'à ce que le temps a passé.
OriginalL'auteur Simone Nigro | 2015-05-23
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour améliorer votre débogage des efforts encore plus loin:
ad 1) le WSDL changer beaucoup de choses? Si non, tour sur cache WSDL. Vous n'avez pas besoin de se connecter au serveur pour récupérer le fichier WSDL.
Est la sortie que vous avez mentionné est vraiment dans
echo $e->getMessage();
? Vous pouvez ajouter un peu de débogage de code à l'intérieur de lacatch()
bloc, par exemple:file_get_contents($soap_url)
)for ($i = 0; $i <= 5; $i++) { /* ... */sleep(1); continue; }
) pour voir si un deuxième essai rendrait le travailDans l'ensemble, "parfois, les erreurs" sont difficiles à déboguer, de sorte que vous devriez essayer de le faire reproductible (qui pointe sur le problème), ou vous avez besoin d'enregistrer et de sortie autant de données que possible, de sorte que vous pouvez voir où le problème a été, au moment où elle s'est produite.
OriginalL'auteur akirk
Im va juste ajouter un de plus peut-être utile extrémité de cette bande de roulement. Ses quelque chose que vous devriez vérifier En plus des autres réponses utiles déjà écrit ici.
Cette erreur peut s'afficher si vous mettez à niveau à partir de php 5.5 ou plus pour PHP 5.6 ou PHP7+. Le paramètre par défaut pour le savon dans les versions plus récentes de PHP est de vérifier l'homologue distant (et il doit en être). Si vous êtes en tirant un WSDL à partir de HTTPS ou avoir un point de terminaison HTTPS puis il vérifie le CA. Si elle échoue, vous obtiendrez cette erreur particulière.
Il y a deux façons de résoudre ce problème.
1) Plus sécurisé option est de vérifier les pairs. Sur un système ubuntu, vous devrez copier les certs à
/usr/local/share/ca-certificates/
et exécuterupdate-ca-certificates
en tant que root.2) Ou vous pouvez désactiver la vérification heres un exemple de comment le faire. - Ce n'est généralement pas la meilleure option, cependant, il pourrait fournir une solution rapide si le problème est urgent. Merci de ne pas être bâclée avec votre sécurité.
- Je trouver la documentation de PHP est un peu fragmentée quand il s'agit de SAVON. Et surtout SAVON WSSE.
Même problème ici, cela résout le problème, je la trouve d'abord dans howtoforge.com/community/threads/... (Répondre par "renky")
OriginalL'auteur Daryl B
Avez-vous essayé d'ouvrir l'URL dans un navigateur ou via wget ou quelque chose de semblable? Ensuite, essayez de rafraîchir une foule de fois, et de voir si des erreurs se produisent. Ma conjecture est que c'est un problème de réseau, mais en effet, un vilain réseau, il est très difficile à déboguer...
OriginalL'auteur Borniet
Veuillez vérifier si keep alive est actif sur le serveur et essayez de modifier ses paramètres. Il pourrait être un problème avec la connexion entre le WSDL de l'extraction et de la demande de l'envoi.
Si le fichier WSDL ne change jamais, vous pouvez essayer de désactiver et de vérifier si cette erreur se produit de nouveau. Juste mis en wsdl à null et définir l'emplacement et de l'uri.
OriginalL'auteur Greg
Utilisez cette fonction pour effacer savon cache dans votre script:
OriginalL'auteur Mehdi Moshtaghi