soap-error: parsing wsdl

Problema:

¡Esto funciona bien en mi servidor WAMP, pero no funciona en el servidor maestro de 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é me estoy perdiendo aquí?!

SOAP está habilitado

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".

Call the URL from PHP
Calling the URL from PHP returns error

$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

Call the URL from command line
Calling the URL from the linux command line HTTP 200 is returned with a XML response curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

Solucion

Para algunas versiones de php, SoapClient no envía información de agente de usuario http. ¿Qué versiones de php tiene en el servidor frente a su WAMP local?

Intente configurar el agente de usuario de forma explícita, utilizando un flujo de contexto de la siguiente manera:

    

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

En realidad, parece haber algunos problemas con el servicio web que está utilizando. La combinación de HTTP sobre IPv6 y la falta de una cadena de agente de usuario HTTP parece dar problemas al servicio web.

Para verificar esto, intente lo siguiente en su host Linux:

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

este IPv6 request falla.

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

este IPv6 request falla.

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

ambos IPv4 request fallan.

Caso interesante :) Supongo que su host Linux resuelve ec.europa.eu en su dirección IPv6, y que su versión de SoapClient no agregó una cadena de agente de usuario de forma predeterminada.