SOAP-erreur: analyse WSDL: impossible de charger à partir de-mais fonctionne sur WAMP

Cela fonctionne bien sur mon serveur WAMP, mais ne fonctionne pas sur le serveur maître linux!?

try{
    $client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);
    $result = $client->checkVat([
        'countryCode' => 'DK',
        'vatNumber' => '47458714'
    ]);
    print_r($result);
}
catch(Exception $e){
    echo $e->getMessage();
}

Qu'est-ce qui me manque ici?! :(

SOAP est activé

Erreur

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl' : failed to load external entity "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"/taxation_customs/vies/checkVatService.wsdl"

Appelez L'URL depuis PHP

L'appel de L'URL depuis PHP renvoie l'erreur

$wsdl = file_get_contents('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl');
echo $wsdl;

Erreur

Warning:  file_get_contents(http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl): failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable

Appelez L'URL depuis la ligne de commande

L'appel de L'URL depuis la ligne de commande linux HTTP 200 est renvoyé avec une réponse XML

curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
46
demandé sur clarkk 2014-02-18 21:28:50

7 réponses

Pour certaines versions de php, le SoapClient n'envoie pas d'informations d'agent utilisateur http. Quelles versions de php avez-vous sur le serveur par rapport à votre WAMP local?

Essayez de définir explicitement l'agent utilisateur en utilisant un flux de contexte comme suit:

try {
    $opts = array(
        'http' => array(
            'user_agent' => 'PHPSoapClient'
        )
    );
    $context = stream_context_create($opts);

    $wsdlUrl = 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl';
    $soapClientOptions = array(
        'stream_context' => $context,
        'cache_wsdl' => WSDL_CACHE_NONE
    );

    $client = new SoapClient($wsdlUrl, $soapClientOptions);

    $checkVatParameters = array(
        'countryCode' => 'DK',
        'vatNumber' => '47458714'
    );

    $result = $client->checkVat($checkVatParameters);
    print_r($result);
}
catch(Exception $e) {
    echo $e->getMessage();
}

Modifier

Il semble en fait y avoir des problèmes avec le service web que vous utilisez. La combinaison de HTTP sur IPv6 et de la chaîne D'Agent utilisateur HTTP manquante semble poser des problèmes au service web.

Pour vérifier cela, essayez le suivant sur votre hôte linux:

curl  -A ''  -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

Cette requête IPv6 échoue.

curl  -A 'cURL User Agent'  -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

Cette requête IPv6 réussit.

curl  -A ''  -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
curl  -A 'cURL User Agent'  -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

Ces deux requêtes IPv4 réussissent.

Cas intéressant:) je suppose que votre hôte linux résout ec.europa.eu à son adresse IPv6, et que votre version de SoapClient n'a pas ajouté de chaîne d'agent utilisateur par défaut.

62
répondu Ivar 2017-07-11 09:00:03

Essayez de changer

$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);

À

$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true, 'cache_wsdl' => WSDL_CACHE_MEMORY]);

Aussi (que cela fonctionne ou non), vérifiez que /tmp est accessible en écriture par votre serveur web et qu'il n'est pas plein.

4
répondu klugerama 2014-02-21 17:31:41

Essayez ceci. J'espère que ça aide

$options = array(
    'cache_wsdl' => 0,
    'trace' => 1,
    'stream_context' => stream_context_create(array(
          'ssl' => array(
               'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
          )
    ))

$client = new SoapClient(url, $options);
3
répondu gogagubi 2018-01-27 20:02:23

503 signifie que les fonctions fonctionnent et que vous obtenez une réponse du serveur distant vous refusant. Si vous avez déjà essayé de boucler les résultats de google, la même chose se produit, car ils peuvent détecter l'agent utilisateur utilisé par file_get_contents et cURL et, par conséquent, bloquer ces agents utilisateurs. Il est également possible que le serveur à partir duquel vous accédez ait également son adresse IP bloquée pour de telles pratiques.

Principalement trois raisons communes pour lesquelles les commandes ne fonctionneraient pas comme le navigateur dans une situation éloignée.

1) L'agent utilisateur par défaut a été bloqué. 2) le bloc IP de votre serveur a été bloqué. 3) l'hôte distant a une détection de proxy.

2
répondu Madan 2014-02-24 15:20:42

Ce problème peut être causé par la désactivation du chargeur d'entité libxml.

Essayez d'exécuter libxml_disable_entity_loader(false); avant l'instanciation SoapClient.

2
répondu Attila Szeremi 2017-01-17 16:13:06

Cela peut être utile pour quelqu'un, bien qu'il n'y ait pas de réponse précise à cette question.

Mon url soap a un port non standard (9087 par exemple), et le pare-feu a bloqué cette requête et j'ai pris à chaque fois cette erreur:

Erreur-2017-12-19 20: 44: 11 -- > erreur fatale-SOAP-erreur: analyse WSDL: impossible de charger à partir de ' http://soalurl.test: 9087 / orawsv?wsdl ' : impossible de charger l'entité externe " http://soalurl.test: 9087 / orawsv?wsdl "

J'ai permis port dans le pare-feu et résolu l'erreur!

1
répondu EmRa228 2017-12-19 17:36:28

J'utilise L'API AdWords, et parfois j'ai le même problème. Ma solution est d'ajouter ini_set ('default_socket_timeout', 900); sur le fichier vendeur \ googleads\googleads-php-lib\src\Google\AdsApi \ AdsSoapClient.php ligne 65

Et dans le vendeur\googleads-php-lib\src\Google\AdsApi\Adwords\Rapports\v201702\ReportDownloader.php ligne 126 ini_set ('default_socket_timeout', 900); $requestOptions ['stream_context'] ['http'] ['délai d'attente'] = "900";

Paquet Google remplace la valeur par défaut php.paramètre ini.

Parfois, la page peut se connecter à ' https://adwords.google.com/ap Je / adwords / mcm/v201702 / ManagedCustomerService?wsdl et parfois non. Si la page se connecte une fois, le cache WSDL contiendra la même page, et le programme sera ok jusqu'à ce que le code actualise le cache...

0
répondu Yohann Nizon 2017-04-24 16:01:58