web-dev-qa-db-ja.com

SOAPエラー:WSDLの解析:からロードできませんでしたが、WAMPで動作します

これは私の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コマンドラインHTTP 200からURLを呼び出すと、XML応答が返されます

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

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

編集

実際には、使用しているWebサービスに問題があるようです。 HTTP over IPv6とHTTPユーザーエージェント文字列の欠落の組み合わせにより、Webサービスの問題が発生しているようです。

これを確認するには、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

これらのIPv4要求は両方とも成功します。

おもしろいケース:) linuxホストはec.europa.euをIPv6アドレスに解決し、SoapClientのバージョンはデフォルトでユーザーエージェント文字列を追加しなかったと思います。

67
Ivar

これを試して。私はそれが役立つことを願っています

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

この問題は、libxmlエンティティローダーが無効になっていることが原因である可能性があります。

SoapClientをインスタンス化する前に、libxml_disable_entity_loader(false);を実行してみてください。

4
Attila Szeremi

変更してみてください

$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]);

また(動作するかどうかに関係なく)、/tmpがWebサーバーによって書き込み可能であり、満杯でないことを確認してください。

4
klugerama

この質問に対する正確な答えはありませんが、誰かにとって役立つかもしれません。

私の石鹸のURLには非標準のポート(たとえば9087)があり、ファイアウォールはその要求をブロックしており、このエラーが発生するたびにエラーが発生しました。

エラー-2017-12-19 20:44:11->致命的なエラー-SOAPエラー:WSDLの解析: ' http://soalurl.test:9087/orawsv?wsdl からロードできませんでした= ':外部エンティティの読み込みに失敗しました " http://soalurl.test:9087/orawsv?wsdl "

ファイアウォールでポートを許可し、エラーを解決しました!

3
EmRa228

503は、機能が機能していることを意味し、リモートサーバーから応答があり、拒否されています。 googleの結果をcURLにしようとした場合、file_get_contentsとcURLで使用されるユーザーエージェントを検出し、結果としてそれらのユーザーエージェントをブロックできるため、同じことが起こります。また、アクセス元のサーバーのIPアドレスがそのようなプラクティスのためにブラックボール化されている可能性もあります。

主に、リモートの状況でブラウザーのようにコマンドが機能しない3つの一般的な理由。

1)デフォルトのUSER-AGENTはブロックされています。 2)サーバーのIPブロックがブロックされています。 3)リモートホストにはプロキシ検出があります。

2
Madan

Php.iniでopenssl拡張機能が無効になっている場合は、有効にしてみてください。このようにして、追加の引数を必要とせずにWebサービスにアクセスできました。

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

AdWords APIを使用していますが、同じ問題が発生する場合があります。私の解決策は、ini_set( 'default_socket_timeout'、900);を追加することです。ファイルvendor\googleads\googleads-php-lib\src\Google\AdsApi\AdsSoapClient.phpの65行目

およびvendor\googleads-php-lib\src\Google\AdsApi\Adwords\Reporting\v201702\ReportDownloader.phpの行126 ini_set( 'default_socket_timeout'、900); $ requestOptions ['stream_context'] ['http'] ['timeout'] = "900";

Googleパッケージは、デフォルトのphp.iniパラメーターを上書きします。

ページが「 https://adwords.google.com/ap i/adwords/mcm/v201702/ManagedCustomerService?wsdl」に接続することもあれば、接続しないこともあります。ページが1回接続すると、WSDLキャッシュに同じページが含まれ、コードがキャッシュを更新するまでプログラムは問題ありません...

0
Yohann Nizon