Иногда не удается вызвать веб-службу.
Эта проблема возникает постоянно.
В чем может быть проблема?
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/