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
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.
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.
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);
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.
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
.
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!
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...