it-swarm.com.de

SOAP-ERROR: Analyse von WSDL: Laden nicht möglich - funktioniert aber mit WAMP

Das funktioniert gut auf meinem WAMP-Server, aber nicht auf dem Linux-Master-Server !?

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();
}

Was fehlt mir hier ?! :(

SOAP ist aktiviert

Error

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"

Rufen Sie die URL von PHP auf

Beim Aufruf der URL von PHP wird ein Fehler zurückgegeben

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

Error

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

Rufen Sie die URL von der Befehlszeile aus auf

Beim Aufruf der URL über die Linux-Befehlszeile wird HTTP 200 mit einer XML-Antwort zurückgegeben

curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
49
clarkk

Bei einigen PHP-Versionen sendet der SoapClient keine Informationen zum HTTP-Benutzeragenten. Welche PHP-Versionen haben Sie auf dem Server im Vergleich zu Ihrem lokalen WAMP?

Versuchen Sie, den Benutzeragenten mithilfe eines Kontextstreams wie folgt explizit festzulegen:

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();
}

Bearbeiten

Es scheint tatsächlich einige Probleme mit dem von Ihnen verwendeten Webdienst zu geben. Die Kombination aus HTTP über IPv6 und einer fehlenden Zeichenfolge für den HTTP-Benutzeragenten scheint die Webdienstprobleme zu verursachen.

Um dies zu überprüfen, versuchen Sie Folgendes auf Ihrem Linux-Host:

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

diese IPv6-Anforderung schlägt fehl.

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

diese IPv6-Anforderung ist erfolgreich.

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

diese beiden IPv4-Anforderungen sind erfolgreich.

Interessanter Fall :) Ich denke, Ihr Linux-Host löst ec.europa.eu in seine IPv6-Adresse auf und Ihre Version von SoapClient hat standardmäßig keine Benutzer-Agent-Zeichenfolge hinzugefügt.

65
Ivar

Versuche dies. Ich hoffe, es hilft

$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);
9
gogagubi

Dieses Problem kann durch das Deaktivieren des libxml-Entitätsladeprogramms verursacht werden.

Versuchen Sie, libxml_disable_entity_loader(false); auszuführen, bevor Sie SoapClient instanziieren.

4
Attila Szeremi

Versuchen Sie es zu ändern

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

zu

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

Überprüfen Sie außerdem (ob dies funktioniert oder nicht), ob /tmp von Ihrem Webserver beschrieben werden kann und nicht voll ist.

4
klugerama

Es kann für jemanden hilfreich sein, obwohl diese Frage nicht genau beantwortet werden kann.

Meine URL-URL hat einen nicht standardmäßigen Port (z. B. 9087), und die Firewall hat diese Anforderung blockiert. Ich habe jedes Mal diesen Fehler festgestellt:

FEHLER - 2017-12-19 20:44:11 -> Schwerwiegender Fehler - SOAP-FEHLER: Analysieren WSDL: Laden von ' http: //soalurl.test: 9087/orawsv? Wsdl ': .__ nicht möglich. Externe Entität konnte nicht geladen werden " http: //soalurl.test: 9087/orawsv? wsdl "

Ich habe Port in Firewall zugelassen und den Fehler behoben!

3
EmRa228

503 bedeutet, dass die Funktionen funktionieren und Sie eine Antwort vom Remote-Server erhalten, der Sie verweigert. Wenn Sie jemals versucht haben, die Ergebnisse von google cURL zu verwenden, geschieht dies auf dieselbe Weise, da sie den von file_get_contents und cURL verwendeten Benutzeragenten erkennen und diese Benutzeragenten blockieren können. Es ist auch möglich, dass für den Server, auf den Sie zugreifen, auch die IP-Adresse für solche Praktiken schwarz ist.

Hauptsächlich drei häufige Gründe, warum die Befehle nicht wie der Browser in einer Remote-Situation funktionieren.

1) Der voreingestellte USER-AGENT wurde blockiert . 2) Die IP-Blockierung Ihres Servers wurde blockiert 3) Der Remote Host verfügt über eine Proxy-Erkennung. 

2
Madan

Versuchen Sie, die openssl-Erweiterung in Ihrer php.ini zu aktivieren, wenn sie deaktiviert ist .. Auf diese Weise konnte ich ohne zusätzliche Argumente auf den Web-Service zugreifen, d. H.

$client = new SoapClient(url);
0
Juan Fernando

Fügen Sie am Ende ?wsdl Hinzu und rufen Sie die Methode auf:

$client->__setLocation('url?wsdl'); 

hat mir geholfen.

0
Sakezzz

Keines der oben genannten Verfahren funktioniert für mich. Nach langem Suchen habe ich die wsdl-Datei vorab heruntergeladen, lokal gespeichert und diese Datei als ersten Parameter an SoapClient übergeben.

Erwähnenswert ist, dass file_get_contents ($ serviceUrl) eine leere Antwort für mich zurückgegeben hat, während die URL in meinem Browser einwandfrei geöffnet wurde. Das ist wahrscheinlich der Grund, warum SoapClient das wsdl-Dokument auch nicht laden konnte. Also habe ich es mit der PHP-Curl-Bibliothek heruntergeladen. Hier ist ein Beispiel

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $serviceUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$wsdl = curl_exec($ch);
curl_close($ch);

$wsdlFile = '/tmp/service.wsdl';
file_put_contents($wsdlFile, $wsdl);

$client = new SoapClient($wsdlFile);

Sie können natürlich Ihre eigene Caching-Richtlinie für die wsdl-Datei implementieren, damit diese nicht bei jeder Anforderung heruntergeladen wird.

0
Shumoapp

Ich verwende das AdWords-API, und manchmal habe ich dasselbe Problem ... Meine Lösung besteht darin, Ini_set ('default_socket_timeout', 900); In der Datei Vendor\googleads\googleads-php hinzuzufügen -lib\src\Google\AdsApi\AdsSoapClient.php Zeile 65

und in vendor\googleads-php-lib\src\Google\AdsApi\Adwords\Reporting\v201702\ReportDownloader.php Zeile 126 ini_set ('default_socket_timeout', 900); $ requestOptions [' stream_context '] [' http '] [' timeout '] = "900";

Das Google-Paket überschreibt den Standardparameter php.ini.

In einigen Fällen kann auf der Seite eine Verbindung zu " https://adwords.google.com/ap .__" hergestellt werden. i/adwords/mcm/v201702/ManagedCustomerService? wsdl und manchmal nein .. Wenn die Seite einmal verbunden wird, enthält der WSDL-Cache dieselbe Seite, und das Programm ist in Ordnung, bis der Code den Cache aktualisiert.

0
Yohann Nizon