SOAP-ERROR:解析WSDL:无法加载 - 但适用于WAMP

cla*_*rkk 51 php soap

这在我的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();
}
Run Code Online (Sandbox Code Playgroud)

我在这里想念的是什么?!:(

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"
Run Code Online (Sandbox Code Playgroud)

从PHP调用URL

从PHP调用URL会返回错误

$wsdl = file_get_contents('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl');
echo $wsdl;
Run Code Online (Sandbox Code Playgroud)

错误

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
Run Code Online (Sandbox Code Playgroud)

从命令行调用URL

HTTP 200XML 命令行调用URL将返回XML响应

curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
Run Code Online (Sandbox Code Playgroud)

Iva*_*var 72

对于某些版本的php,SoapClient不会发送http用户代理信息.您在服务器上与本地WAMP有什么PHP版本?

尝试使用上下文流显式设置用户代理,如下所示:

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();
}
Run Code Online (Sandbox Code Playgroud)

编辑

它实际上似乎是您正在使用的Web服务的一些问题.HTTP over IPv6和缺少HTTP用户代理字符串的组合似乎给Web服务带来了问题.

要验证这一点,请在Linux主机上尝试以下操作:

curl  -A ''  -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
Run Code Online (Sandbox Code Playgroud)

此IPv6请求失败.

curl  -A 'cURL User Agent'  -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
Run Code Online (Sandbox Code Playgroud)

此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
Run Code Online (Sandbox Code Playgroud)

这两个IPv4请求都成功了.

有趣的案例:)我猜您的linux主机将ec.europa.eu解析为其IPv6地址,并且您的SoapClient版本默认情况下未添加用户代理字符串.

  • 报告的SoapClient用户代理错误的链接https://bugs.php.net/bug.php?id=60887 (2认同)

gog*_*ubi 14

试试这个.我希望它有所帮助

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

$client = new SoapClient($url, $options);
Run Code Online (Sandbox Code Playgroud)


Att*_*emi 5

可能是由于禁用了libxml实体加载器导致的。

libxml_disable_entity_loader(false);在实例化之前尝试运行SoapClient

  • 这是 PHP 中一个非常令人讨厌的错误,它可能会导致 Linux 中的赛车状况:https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1160336 (2认同)

EmR*_*228 5

尽管这个问题没有准确的答案,但它可能对某人有所帮助。

我的soap url有一个非标准端口(例如9087),防火墙阻止了该请求,每次出现此错误时我都会接受:

错误 - 2017-12-19 20:44:11 --> 致命错误 - SOAP 错误:解析 WSDL:无法从“ http://soalurl.test:9087/orawsv?wsdl ”加载:无法加载外部实体“ http://soalurl.test:9087/orawsv?wsdl

我在防火墙中允许端口并解决了错误!