Webサービスの呼び出しに失敗する場合があります。
この問題は常に発生します。
何が問題なのでしょうか?
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はSoapClient::SoapClient
で指定されたWSDL URLに最初の呼び出しを行い、それに接続して結果を受信した後、結果で指定されたWSDLに接続しようとしますに:
<soap:address location="http://"/>
また、WSDLがCould not connect to Host
で指定したものと異なり、到達不能である場合、呼び出しはエラーSoapClient::SoapClient
で失敗します(私の場合は http://Host.local/ を使用するSoapUIでした) =)。
PHP 5.4)の動作は異なり、SoapClient::SoapClient
のWSDLを常に使用します。
ホストがダウンしているか、応答が非常に遅い。応答が遅い場合は、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 configセクションがあり、次のように表示されます。
[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ファイルキャッシュが有効になっている場合、phpコードでwsdl URIを変更すると、この問題が発生する可能性があります。この例では、wsdl-
ディレクトリの下の/tmp
で始まるファイルを削除できます。または、soap.wsdl_cache_enabled=0;
およびsoap.wsdl_cache_ttl=0;
PHPを設定すると、ページにアクセスするたびにwsdlファイルが取得されます。
misconfigured サービスは、tempuri.orgでデフォルトのネームスペースを残します
つまり、wsdlへの接続は機能しますが、関数呼び出しは失敗します。
スタックトレース:
SoapClient-> __doRequest( 'http://example.com ...'、 ' http://tempuri.org ....'、2、0)
これを修正するには、__setLocation()
を使用して場所を明示的に設定する必要があります
$this->soapClient = new \SoapClient(WS_URL);
$this->soapClient->__setLocation(WS_URL);
私の場合、wsdlへの接続後に機能しました。関数__setLocation()
を使用して、呼び出しがエラーで失敗するため、場所を再度定義します。
ホストに接続できませんでした
これは、WSDLがSoapClient::SoapClient
で指定されたものと異なる場合に発生します。
私は自分でこの問題にぶつかり、掘り下げた後、最終的に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
だから、php context ssl/cipher値を適切に設定しました。
私たちのケースでは、暗号のネゴシエーションの問題でした。このエラーはランダムに発生していました。次のような暗号を強制することで問題を解決しました。
$soapClient = new SoapClient('http://example.com/soap.asmx?wsdl',array("stream_context" => stream_context_create(array('ssl' => array('ciphers'=>'AES256-SHA')))));
PHPは各サービス呼び出しで同じ暗号をネゴシエートしていませんでした。
私のためのこの仕事
$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)
));
エラーSoapFault exception: Could not connect to Host
はいくつかの異なる原因で発生する可能性があるようです。私の場合、それはプロキシ、ファイアウォール、またはDNSによるものではありません(実際には、特別な設定なしで nusoap を使用して動作する同じマシンからのSOAP接続がありました)。
最後に、SoapClientコンストラクターのlocal_cert
オプションで参照した無効なpem
ファイルが原因であることがわかりました。
解決策:pem
ファイルから証明書チェーンを削除したとき、only証明書と秘密キーが含まれ、SOAP呼び出しが開始されました。
私はついにその理由を見つけました。そのライブラリがシステム上にCAバンドルを見つけられないためです。 PHP> = v5.6は自動的にverify_peerをデフォルトでtrueに設定します。ただし、すべてのシステムがディスク上に既知のCAバンドルを持っているわけではありません。
次の手順のいずれかを試すことができます。
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.verify_peerを無効化
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
サーバーにファイアウォールがある場合は、SOAPが使用するポートを開いてください。
私の場合、ポート1664を開く必要がありました。
iptables -t filter -A INPUT -p tcp --dport 1664 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 1664 -j ACCEPT
私の場合、wsdlのサービスアドレスが間違っています。
私のWSDLのURLは。
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/"/>
がんばろう。
私と一緒に、WCFサービスのapp.configのベースアドレスのこの問題:私が使用したとき:
<baseAddresses><add baseAddress="http://127.0.0.1:9022/Service/GatewayService"/> </baseAddresses>
.netを使用してパブリックIPまたはドメインに接続する場合は問題ありません。
ただし、PHPのSoapClientを使用して「http://[online ip]:9022/Service/GatewayService
"、例外「Coulod not host to host」がスローされます
BaseAddressを[online ip]:9022に変更しましたが、すべて問題ありません。
私にとってはDNSの問題でした。私のVPSのネームサーバーが壊れたので、/ etc/resolv.confを編集してGoogleに切り替えました。nameserver8.8.8.8 nameserver 8.8.4.4
ujavaのソリューションで解決できない場合は、try/catchを使用してこの致命的な問題をキャッチしてみてください。これはうまくいきます。
try{
$res = $client->__call('LineStopQueryJson',array('Parameters' => $params));
}catch(SoapFault $e){
print_r($client);
}
laravel外部のSOAPサーバーの同じwsdlに多くのリクエストを送信し、しばらくしてCould not connect to Host
エラー。
問題は、リクエストが行われる前に毎回新しいSoapClient
インスタンスを作成していたためです。そんなことしたらダメ。一度作成して、同じクライアントから各リクエストを作成します。
それが役に立てば幸い。
このエラーが発生した他の人を助けるために、<soap:address location="https://some.url"/>
に無効な証明書があり、エラーが発生しました。
接続がSSL経由の場合、クライアントではなくサーバーの問題である可能性があります(私の場合)。
PHPバージョン5.6および7以降は、サーバー証明書で使用されるCipherSuiteを確認するために重要です。このバージョンで許可されている暗号の完全なリストと、このWebリンク: https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Ciphersuite
使用されている暗号が許可されていない(非推奨のアルゴリズムである)場合、SoapClientは「Could not connect to Host」を受け取り、それに関するトレースはこれ以上ありません。
使用される暗号は、たとえば「SSL情報」のセクションでSoapUIなどのクライアントによって確認できます。
インターネット上でこれについて扱っているスレッドフォーラムはありません。
これもチェックしてください: http://php.net/manual/en/migration56.openssl.php
私にとって、これはhttpd
サービスの問題でした(Fedora 24)。簡単な再起動でうまくいきました:
Sudo service httpd restart
私にとっては、証明書の問題でした。次は私のために働いた
$context = stream_context_create([
'ssl' => [
// set some SSL/TLS specific options
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]);
$client = new SoapClient(null, [
'location' => 'https://...',
'uri' => '...',
'stream_context' => $context
]);
Php.iniの設定が間違っていました。パスと証明書の有効性を確認してください...
[openssl]
openssl.cafile = "C:/good/phpath/ca-bundle.crt"
新しい\ SoapClient($ wsdl)がhttpsだったからです!