1

これが私が遭遇しているサーバー設定/問題です:

  • SOAPがインストールされ、サーバー上で動作している
  • PHP SOAP拡張機能(new SoapClient(self::VAT_VALIDATION_WSDL_URL))を使用して呼び出しを行う
  • 私が使用しているWSDLURLは次のとおりです。http://ec.europa.eu/taxation_customs/vies/services/checkVatService ?wsdl
  • 同じコードが他のほとんどのマシンで機能していますが、現在のマシンでは機能していません
  • SOAP応答はrequest_success => bool(false)であるため、要求は正常に行われません。
  • たとえば、telnetを使用してURLに接続しようとすると、503内部サーバーエラーが発生し、他のコンピューターからは502アクセスが拒否されます。
4

2 に答える 2

8

ここでの問題を追跡するのは難しいですが、解決するのは簡単です。

ec.europa.euはIPv6要求を受け入れ、 IPv6を使用してそれらに応答します。問題は、すべてのサービスがIPv6で正しく機能しているわけではないことです。したがって、サーバーがIPv4とIPv6の両方で動作する場合、IPv6の使用を優先するため、SOAP要求は失敗します。

例えば:

WKT-03:~$ ping6 ec.europa.eu #not working
connect: Network is unreachable

WKT-03:~$ ping ec.europa.eu #working
PING ec.europa.eu (147.67.136.103) 56(84) bytes of data.

解決:

サーバーでipv6を無効にするか、次の場所に新しいルールを追加するかの2つの解決策があり/etc/hostsます。

147.67.136.103 ec.europa.eu # when/if IP changes, this stops working

したがって、IPv4を使用するように強制します。どちらも非常にエレガントではありませんが、APIがIPv6で完全に機能するまでこれは機能するはずです。

于 2013-03-25T13:59:56.170 に答える
-2

SoapClientにはstream_contextオプションがあります。

  1. IPV4インターフェースstream_contextをターゲットにして作成するbindto
  2. SoapClientでこのコンテキストを使用します。

例:

$opts = array(
    'socket' => array(
        'bindto' => 'IP4_ADDRESS_OF_YOUR_SERVER:0'
    )
);
$context = stream_context_create($opts);
$client = new SoapClient(self::VAT_VALIDATION_WSDL_URL,
    array(
        'stream_context' => $context
    )
);
于 2014-06-12T13:10:55.973 に答える