SOAP-ERROR: анализ 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" 

Вызов URL из PHP

Вызов URL из PHP возвращает ошибку

 $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 из командной строки

Вызов URL-адреса из командной строки linux 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 по протоколу 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 

оба этих запроса IPv4 успешно завершены.

Интересный случай 🙂 Я предполагаю, что ваш хост linux разрешает ec.europa.eu на свой IPv6-адрес и что ваша версия SoapClient по умолчанию не добавила строку пользовательского агента.

Попробуйте изменить

 $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 был доступен для записи вашим веб-сервером и чтобы он не был заполнен.

503 означает, что функции работают, и вы получаете ответ от удаленного сервера, отрицающего вас. Если вы когда-либо пытались выполнить CURL-результаты Google, то происходит то же самое, потому что они могут обнаружить пользовательский агент, используемый файловыми_компонентами и cURL, и в результате блокируют эти пользовательские агенты. Также возможно, что сервер, к которому вы обращаетесь, также имеет свой IP-адрес, защищенный для таких методов.

Главным образом три общие причины, по которым команды не будут работать так же, как браузер в удаленной ситуации.

1) ПОЛЬЗОВАТЕЛЬ-АГЕНТ ПОЛЬЗОВАТЕЛЯ по умолчанию заблокирован. 2) IP-блок вашего сервера заблокирован. 3) Удаленный хост имеет обнаружение прокси.

Эта проблема может быть вызвана тем, что загрузчик объектов libxml отключен.

Попробуйте запустить libxml_disable_entity_loader(false); перед созданием SoapClient .

Я использую API AdWords, и иногда у меня такая же проблема. Мое решение – добавить ini_set ('default_socket_timeout', 900); в файле vendor \ googleads \ googleads-php-lib \ src \ Google \ AdsApi \ AdsSoapClient.php строка 65

и в поставщике \ 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, а иногда и к нет. Если страница подключается один раз, кэш WSDL будет содержать одну и ту же страницу, и программа будет в порядке, пока код не обновит кеш …

Это может быть полезно для кого-то, хотя нет точного ответа на этот вопрос.

Мой urar url имеет нестандартный порт (например, 9087), и брандмауэр заблокировал этот запрос, и я каждый раз принимал эту ошибку:

ОШИБКА – 2017-12-19 20:44:11 -> Неустранимая ошибка – SOAP-ERROR: Разбор WSDL: Не удалось загрузить с ' http: //soalurl.test: 9087 / orawsv? Wsdl ': не удалось загрузить внешние объект " http: //soalurl.test: 9087 / orawsv? wsdl "

Я разрешил порт в брандмауэре и решил ошибку!