1. ホーム
  2. php

[解決済み] SOAP-ERROR: WSDLのパース: からロードできませんでした - しかし、WAMPで動作します。

2022-03-12 23:24:02

質問

これは、私のWAMPサーバーでは正常に動作しますが、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();
}

何を見落としているんだ! :(

SOAPが有効

エラー

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"

PHPからURLを呼び出す

PHPからURLを呼び出すとエラーが発生する

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

エラー

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

コマンドラインからURLを呼び出す

linuxのコマンドラインからURLを呼び出す HTTP 200 はXMLレスポンスで返されます

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

解決方法は?

php のバージョンによっては、SoapClient が http ユーザーエージェント情報を送信しません。サーバー上のphpのバージョンと、ローカルのWAMPのバージョンを教えてください。

以下のようにコンテキストストリームを使用して、明示的にユーザーエージェントを設定してみてください。

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

編集

実は、お使いのウェブサービスに何らかの問題があるようです。HTTP over IPv6とHTTP User Agent文字列の欠落の組み合わせが、ウェブサービスに問題を与えているようです。

これを確認するために、Linuxホストで以下を試してみてください。

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

このIPv6リクエストは失敗です。

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

このIPv6リクエストは成功する。

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

という2つのIPv4リクエストに成功しました。

面白いケースですね :) あなたのLinuxホストがec.europa.euをIPv6アドレスに解決し、あなたのバージョンのSoapClientがデフォルトでユーザーエージェント文字列を追加していないのでしょう。