14

このコードを使用して、SOAP リクエストを作成します

$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のホスト(Windows上にあります)にDNSの解像度を追加しようとしましたwindows/system32/drivers/etc/hosts

160.XX.XXX.XX example.com

発生する例外が少なくなります

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

発生する例外が少なくなります

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

default_socket_timeout = 90

何も変わっていません

質問

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

私の設定

PHP5.6

アパッチ 2.4

Windows Server 2012

アップデート

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

4

5 に答える 5

19

このトレッドに役立つ可能性のあるヒントをもう 1 つ追加します。すでにここに書かれている他の有用な回答に加えて、確認する必要があります。

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

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

1) 最も安全なオプションは、ピアを検証することです。ubuntu システムでは、証明書をコピーして root として/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.
        )
    ))
 ));

SOAPに関しては、PHPのドキュメントが少し断片的であることがわかりました。特にSOAP WSSE。

于 2016-06-08T23:12:27.553 に答える
7

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

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

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

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

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

于 2015-05-29T11:07:34.580 に答える
1

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

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

于 2015-05-30T19:11:26.870 に答える
1

ブラウザまたは wget などで URL を開こうとしましたか? 次に、何兆回も更新してみて、エラーが発生するかどうかを確認します。私の推測では、これはネットワークの問題ですが、実際には不安定なネットワークが原因でデバッグが非常に難しくなっています...

于 2015-05-29T11:13:02.637 に答える