web-dev-qa-db-fra.com

PHP SoapClient: exception SoapFault Impossible de se connecter à l'hôte

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.

13
Simone Nigro

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:

  • vérifiez si vous pouvez vous connecter au serveur d'une autre manière (par exemple file_get_contents($soap_url))
  • sinon, vérifiez le type d'erreur que vous obtenez
    • imprimer l'heure et consulter les journaux d'erreurs sur le serveur SOAP
    • a 403 Forbidden ou des points d'erreur similaires sur un problème sur le serveur
    • a Impossible de se connecter error pointe vers un problème de réseau (pas exclusivement mais les chances sont plus élevées pour cela)
  • Vous pouvez essayer de le mettre en boucle (quelque chose comme for ($i = 0; $i <= 5; $i++) { /* ... */ sleep(1); continue; }) pour voir si un deuxième essai le ferait fonctionner

Dans 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.

7
akirk

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.

17
Daryl B

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.

1
Greg

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 ...

1
Borniet

Utilisez ceci pour vider le cache soap dans votre script:

ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);
0
Mehdi Moshtaghi