Исключение SoapFault: Не удалось подключиться к хосту

Иногда не удается вызвать веб-службу.

Эта проблема возникает постоянно.

В чем может быть проблема?

Error: SoapFault exception: [HTTP] Could not connect to host in 0 [internal function]: SoapClient->__doRequest('<?xml version="...', http://.', '', 1, 0) 

Проблема была решена. Проблема заключается в кеше

 ini_set('soap.wsdl_cache_enabled',0); ini_set('soap.wsdl_cache_ttl',0); 

Я добавляю свой комментарий для полноты, поскольку перечисленные здесь решения не помогли мне. На PHP 5.6 SoapClient делает первый вызов указанного URL WSDL в SoapClient::SoapClient и после подключения к нему и получения результата он пытается подключиться к WSDL, указанному в результате:

 <soap:address location="http://"/> 

И вызов завершился с ошибкой. Could not connect to host если WSDL отличается от того, который вы указали в SoapClient::SoapClient и недоступен (мой случай был SoapUI с использованием http: //host.local/ ).

Поведение в PHP 5.4 отличается и оно всегда использует WSDL в SoapClient::SoapClient .

Хост либо работает, либо очень медленно реагирует. Если это медленное реагирование, вы можете попытаться увеличить таймаут через параметр connection_timeout или с помощью параметра default_socket_timeout и посмотреть, уменьшает ли это ошибки.

http://www.php.net/manual/en/soapclient.soapclient.php

http://www.php.net/manual/en/filesystem.configuration.php#ini.default-socket-timeout

Вы также можете включить обработку ошибок, поскольку zanlok указал, чтобы повторить несколько раз. Если у вас есть пользователи, которые действительно ждут этих SOAP-вызовов, вам нужно будет поставить их в очередь и обработать их в фоновом режиме и уведомить пользователя, когда они будут завершены.

в вашем файле php.ini, который управляет кэшем доступа wsdl, может быть показано как:

 [soap] ; Enables or disables WSDL caching feature. soap.wsdl_cache_enabled=1 ; Sets the directory name where SOAP extension will put cache files. soap.wsdl_cache_dir="/tmp" ; (time to live) Sets the number of second while cached file will be used ; instead of original one. soap.wsdl_cache_ttl=86400 

если кеш-файл wsdl включен, это может вызвать эту проблему при изменении URI wsdl в php-коде. в этом примере вы можете просто удалить файл с wsdl- /tmp . или вы просто установите soap.wsdl_cache_enabled=0; и soap.wsdl_cache_ttl=0; PHP будет получать файл wsdl каждый раз, когда вы посещаете страницу.

Я сам попал в эту проблему, и после долгого рытья я в конце концов нашел эту ошибку для ubuntu:

https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/965371

конкретно

https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/965371/comments/62

openssl s_client -connect site.tld:443 не удалось, но openssl s_client -tls1 -connect site.tld:443 дал успех. В моем конкретном случае часть вывода включала New, TLSv1/SSLv3, Cipher is RC4-MD5 поэтому я правильно установил значение ssl / cipher для php-контекста.

Кажется, ошибка SoapFault exception: Could not connect to host может быть несколько разных вещей. В моем случае это не было вызвано прокси-сервером, брандмауэром или DNS (у меня на самом деле было соединение SOAP с той же машины, работающей с помощью nusoap без какой-либо специальной настройки).

Наконец, я обнаружил, что это было вызвано недопустимым файлом pem который я ссылался в опции local_cert в моем конструкторе SoapClient.

Решение. Когда я удалил цепочку сертификатов из файла pem , поэтому он содержал только сертификат и закрытый ключ, вызовы SOAP начали проходить.

Для меня это проблема DNS. Мои серверы имен VPS исчезли, поэтому я переключился на Google, отредактировав файл /etc/resolv.conf, чтобы быть: nameserver 8.8.8.8 nameserver 8.8.4.4

Если на вашем сервере установлен брандмауэр, обязательно откройте порт, используемый SOAP.

В моем случае мне пришлось открыть порт 1664.

 iptables -t filter -A INPUT -p tcp --dport 1664 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 1664 -j ACCEPT 

если решение ujava не может вам помочь, вы можете попытаться использовать try / catch, чтобы поймать этот фатальный, это отлично работает на меня.

 try{ $res = $client->__call('LineStopQueryJson',array('Parameters' => $params)); }catch(SoapFault $e){ print_r($client); } 

Со мной эта проблема в базовом адресе в app.config службы WCF: когда я использовал:

 <baseAddresses><add baseAddress="http://127.0.0.1:9022/Service/GatewayService"/> </baseAddresses> 

это нормально, если вы используете .net для подключения к публичному ip или домену.

Но когда вы используете PHP SoapClient для подключения к « http://[online ip]:9022/Service/GatewayService », это исключение для исключения «Coulod not connect to host»

Я изменил baseAddress на [онлайн-ip]: 9022, и все в порядке.

В моем случае адрес службы в wsdl неверен.

Мой URL-адрес wsdl.

https://myweb.com:4460/xxx_webservices/services/ABC.ABC?wsdl

Но адрес службы в этом xml-результате.

 <soap:address location="http://myweb.com:8080/xxx_webservices/services/ABC.ABC/"/> 

Я просто сохраняю этот XML-файл в локальном файле и меняю адрес службы.

 <soap:address location="https://myweb.com:4460/xxx_webservices/services/ABC.ABC/"/> 

Удачи.

У меня была плохая конфигурация php.ini. Проверьте путь и срок действия сертификата …

 [openssl] openssl.cafile = "C:/good/phpath/ca-bundle.crt" 

Потому что мой новый \ SoapClient ($ wsdl) был https!

Чтобы помочь другим людям, столкнувшимся с этой ошибкой, URL-адрес в <soap:address location="https://some.url"/> имел недопустимый сертификат и вызвал ошибку.

В нашем случае это была проблема переговоров с Ciphers. Мы получали эту ошибку случайным образом. Мы решили наш problmem, заставив Ciphers следующим образом:

 $soapClient = new SoapClient('http://example.com/soap.asmx?wsdl',array("stream_context" => stream_context_create(array('ssl' => array('ciphers'=>'AES256-SHA'))))); 

Похоже, что PHP не обсуждал одни и те же шифры при каждом вызове службы.

Для меня это было проблемой в службе httpd (Fedora 24). Простой перезапуск сделал трюк:

 sudo service httpd restart 

В моем случае он работал после подключения к wsdl, используйте функцию __setLocation() чтобы определить местоположение снова, потому что вызов завершается с ошибкой:

Не удалось подключиться к хосту

Это происходит, если WSDL отличается от указанного в SoapClient::SoapClient .

Я, наконец, нашел причину, потому что ее библиотека не может найти комплект СА в вашей системе. PHP> = v5.6 автоматически устанавливает verify_peer в true по умолчанию. Однако не все системы имеют известный набор СА на диске.

Вы можете попробовать одну из следующих процедур:

1.Если у вас есть файл CA в вашей системе, установите openssl.cafile или curl.cainfo в свой php.ini на путь вашего файла CA.

2.Установите местоположение своего файла SSL CA.

 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($cHandler, CURLOPT_CAINFO, $path-of-your-ca-file); 

3.disabled verify_peer

 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

Это, скорее всего, относится к проблеме подключения. Это может быть либо то, что ваше интернет-соединение было недоступно, либо веб-сервис, который вы пытаетесь использовать, был недоступен. Я предлагаю использовать эту услугу, чтобы узнать, находится ли веб-служба в сети или нет: http://downforeveryoneorjustme.com/