Исключение SoapFault: не удалось подключиться к хосту - PullRequest
28 голосов
/ 01 декабря 2010

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

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

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

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

Ответы [ 22 ]

26 голосов
/ 01 декабря 2010

Проблема была решена. Проблема в кеше

ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);
20 голосов
/ 04 декабря 2014

Я добавляю свой комментарий для полноты, поскольку решения, перечисленные здесь, не помогли мне. В 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.

12 голосов
/ 01 декабря 2010

Хост либо не работает, либо очень медленно отвечает. Если он не отвечает, вы можете попытаться увеличить время ожидания с помощью параметра 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, вам нужно будет поставить их в очередь, обработать в фоновом режиме и уведомить пользователя, когда они закончат.

8 голосов
/ 25 октября 2012

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

4 голосов
/ 08 мая 2018

A неправильно настроен служба оставляет пространство имен по умолчанию с tempuri.org

Это означает, что соединение с wsdl будет работать, но вызов функции не удастся.

Stacktrace:

SoapClient -> __ doRequest ('http://example.com. ..', 'http://tempuri.org....', 2, 0)

Чтобы исправить это, вы должны явно указать местоположение, используя __setLocation()

$this->soapClient = new \SoapClient(WS_URL);
$this->soapClient->__setLocation(WS_URL);
4 голосов
/ 09 января 2013

Я сам решил эту проблему и после долгих поисков обнаружил эту ошибку для 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.

3 голосов
/ 13 мая 2018

Эта работа для меня

$opts = array(
  'ssl' => array('verify_peer' => false, 'verify_peer_name' => false)
);

if (!isset($this->soap_client)) {
  $this->soap_client = new SoapClient($this->WSDL, array(
    'soap_version'   => $this->soap_version,
    'location'       => $this->URL,
    'trace'          => 1,
    'exceptions'     => 0,
    'stream_context' => stream_context_create($opts)
  ));
3 голосов
/ 03 ноября 2017

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

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

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

3 голосов
/ 31 января 2017

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

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

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

3 голосов
/ 30 октября 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...