web-dev-qa-db-ja.com

PHP SoapClient:SoapFault exception could not connect to host

このコードを使用して石鹸のリクエストを行います

$client = new SoapClient('http://example.com/soap/wsdl');

try {
    $result = $client->myMethod();
} catch (Exception $e) {
    echo $e->getMessage();
}

時々(10回に1回)、例外が発生します:

SoapFault例外:[HTTP]ホストに接続できませんでした

私の試み

1)私は解決策を探しました、そして 私は読んだ この問題はwsdlキャッシュが原因である可能性があることを私はphp.iniで無効にしました:

soap.wsdl_cache_enabled = 0
soap.wsdl_cache_ttl = 0

レイズする例外が少なくなる

2)windows/system32/drivers/etc/hostsのDNSの解像度をWindowsのホスト(Windowsにあります)に追加しようとしました:

160.XX.XXX.XX example.com

レイズする例外が少なくなる

3)「Windowsファイアウォール」も無効にしようとしましたが、

レイズする例外が少なくなる

4)php.iniのdefault_socket_timeoutも増やしてみました

default_socket_timeout = 90

何も変更されていません

質問

サーバーソープに問題はないようですが、他のサイトからも問題なく使用されています。他に何かできることはありますか?

私の設定

PHP 5.6

Apache 2.4

Windowsサーバー2012

[〜#〜]更新[〜#〜]

多くのテストの結果、問題はネットワークにあると思います。SOAPサーバーはリバースプロキシの背後にあり、問題はプロキシに現れます。

14
Simone Nigro

デバッグ作業をさらに改善する必要があります。

ad 1)WSDLは大きく変わりますか?そうでない場合、オンにする WSDLキャッシング。 WSDLファイルを取得するためにサーバーに接続する必要はありません。

あなたが言及した出力は本当にecho $e->getMessage();で作成されたのですか? catch()ブロック内にデバッグコードを追加できます。次に例を示します。

  • 別の方法でサーバーに接続できるかどうかを確認します(例:file_get_contents($soap_url)
  • そうでない場合は、発生しているエラーの種類を確認してください
    • 時間を出力し、SOAPサーバーでエラーログを確認します
    • a 403 Forbiddenまたはサーバーの問題に関する同様のエラーポイント
    • a 接続できませんでしたエラーはネットワークの問題を示しています(排他的ではありませんが、その可能性が高くなります)
  • これをループ(for ($i = 0; $i <= 5; $i++) { /* ... */ sleep(1); continue; }の行に沿ったもの)に入れて、2回目の試行で機能するかどうかを確認できます。

全体として、「時々エラー」はデバッグするのが難しいので、再現できるようにするか(問題を指摘する)、またはできるだけ多くのデータを記録および出力して、どこにあるかを確認できるようにする必要があります問題はそれが発生したときのものでした。

7
akirk

Imは、このトレッドにおそらく役立つヒントをもう1つ追加します。ここですでに書かれている他の有用な回答に加えて、チェックする必要があるその何か。

PHP 5.5以前からPHP 5.6またはPHP7 +)にアップグレードすると、このエラーが表示されることがあります。新しいバージョンのSOAPのデフォルト設定は、PHPリモートピアを確認します(そうする必要があります)。HTTPSからWSDLをプルしている場合、またはHTTPSエンドポイントがある場合は、CAをチェックします。失敗すると、この特定のエラーが発生します。

これを解決するには2つの方法があります。

1)最も安全なオプションは、ピアを検証することです。 ubuntuシステムでは、証明書を/usr/local/share/ca-certificates/にコピーし、ルートとしてupdate-ca-certificatesを実行します。

2)または、確認方法を無効にすることができます。 -これは一般に推奨されるオプションではありませんが、問題が緊急の場合は迅速に修正できます。ただし、セキュリティにだらしないでください。

$soapClient = new SoapClient($wsdl_url, array(
    //'trace' => 1,
    'stream_context' => stream_context_create(array(
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false, 
            'allow_self_signed' => true //can fiddle with this one.
        )
    ))
 ));

PHPドキュメントはSOAPに関しては断片化されています。特にSOAP WSSEです。

17
Daryl B

サーバーでキープアライブがアクティブになっているかどうかを確認し、そのパラメーターを変更してみてください。 WSDLフェッチと要求送信の間の接続に問題がある可能性があります。

WSDLファイルが変更されない場合は、無効にして、このエラーが再び発生するかどうかを確認してください。 wsdlをnullに設定し、場所とURIを設定するだけです。

1
Greg

ブラウザやwgetなどでURLを開こうとしましたか?次に、何億回も更新してみて、エラーが発生するかどうかを確認します。これはネットワークの問題だと思いますが、確かにネットワークが不安定なため、デバッグが非常に困難です...

1
Borniet

これを使用して、スクリプトのSOAPキャッシュをクリアします。

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