en utilisant ce code je fais des demandes de savon
$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 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, je l'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 dans php.ini
default_socket_timeout = 90
rien n'a changé
La question
Le feuilleton de serveur ne semble pas avoir de problèmes. Il est utilisé sans problèmes également par d’autres sites. Y at-il autre chose que je puisse faire?
Mes paramètres
PHP 5.6
Apache 2.4
Windows Server 2012
METTRE À 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.
Vous devez encore améliorer vos efforts de débogage:
ad 1) Le WSDL change-t-il beaucoup? Sinon, activez la mise en cache WSDL. Vous n'avez pas besoin de vous connecter au serveur pour récupérer le fichier WSDL.
La sortie que vous avez mentionnée est-elle vraiment créée dans echo $e->getMessage();
? Vous pouvez ajouter du code de débogage dans le bloc catch()
, par exemple:
file_get_contents($soap_url)
)for ($i = 0; $i <= 5; $i++) { /* ... */ sleep(1); continue; }
) pour voir si un deuxième essai le ferait fonctionnerDans l’ensemble, il est difficile de corriger les erreurs "parfois", vous devez donc essayer de le rendre reproductible (ce qui vous indiquera le problème), ou vous devez enregistrer et sortir autant de données que possible de manière à pouvoir voir où se trouvent les données. le problème était au moment où il s'est produit.
Je vais juste ajouter un autre conseil éventuellement utile à cette bande de roulement. C’est quelque chose que vous devriez vérifier En plus des autres réponses utiles déjà écrites ici.
Cette erreur risque de se produire si vous effectuez une mise à niveau depuis PHP 5.5 ou une version antérieure vers PHP 5.6 ou PHP7 +. Le paramètre par défaut de soap dans les versions les plus récentes de PHP est de vérifier l'homologue distant (et il devrait en être ainsi). Si vous extrayez un WSDL à partir de HTTPS ou si vous avez un point de terminaison HTTPS, il vérifiera l'autorité de certification. Si cela échoue, vous obtiendrez cette erreur particulière.
Il y a deux façons de résoudre ce problème.
1) L’option la plus sécurisée est de vérifier l’homologue. Sur un système Ubuntu, copiez les certificats dans /usr/local/share/ca-certificates/
et exécutez update-ca-certificates
en tant que root.
2) Ou vous pouvez désactiver la vérification ci-dessous un exemple de la façon de le faire. - Ce n’est généralement pas l’option privilégiée, mais elle pourrait fournir une solution rapide si le problème était urgent. S'il vous plaît ne soyez pas négligé avec votre sécurité si.
$soapClient = new SoapClient($wsdl_url, array(
//'trace' => 1,
'stream_context' => stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true //can fiddle with this one.
)
))
));
Je trouve que la documentation PHP est un peu fragmentée en ce qui concerne SOAP. Et surtout SOAP WSSE.
Veuillez vérifier si Keep Alive est actif sur le serveur et essayez de modifier ses paramètres. Il peut s'agir d'un problème de connexion entre l'extraction WSDL et l'envoi de demandes.
Si le fichier WSDL ne change jamais, vous pouvez essayer de le désactiver et de vérifier si cette erreur se reproduit. Il suffit de définir wsdl sur null et de définir location et uri.
Avez-vous essayé d'ouvrir l'URL dans un navigateur ou via wget ou quelque chose de similaire? Ensuite, essayez d'actualiser un million de fois et voyez si des erreurs se produisent. Mon hypothèse est qu'il s'agit d'un problème de réseau, mais en réalité, un réseau débridé rend le débogage très difficile ...
Utilisez ceci pour vider le cache soap dans votre script:
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);