基于IPv4的PHP SOAP客户端

时间:2016-12-29 14:59:05

标签: php soap ipv6 soap-client ipv4

我有一个需要连接到SOAP服务器的PHP客户端:

$client = new \SoapClient('url_to_wsdl.wsdl', [
                'local_cert' => 'path_to_certificate.pem', 
                'connection_timeout ' => 300,
                'trace' => 1,
            ]);

$params = [];
$response = $client->executeAFunction($params);

但SOAP客户端无法连接到主机:SoapFault "Could not connect to host"(它实际上也无法加载wsdl文件,但我通过使用该文件的本地副本来模拟它)。

我发现Soap客户端无法连接到主机,因为它似乎默认使用IPv6(由于this answer on SO,我达到了这一点。)

到目前为止我做了什么:

  • 我已经在我的服务器(ubuntu)上禁用了IPv6,但这并没有改变 任何与SOAP客户端有关的东西。
  • 我通过服务器终端

    仔细检查了IPv4和IPv6网站的可访问性
    $ curl -6 http://v6.testmyipv6.com/
    curl: (6) Could not resolve host: v6.testmyipv6.com
    
    $ curl -4 http://v4.testmyipv6.com/
    <html>
    <head>
    <title>IPv6 Test and Dual-Stack Test For Network Connectivity</title>
    ...
    
    # the above commands are true for all urls I tested
    

我的实际问题是:如何告诉Soap客户端使用IPv4而不是使用IPv6连接到主机?

2 个答案:

答案 0 :(得分:0)

SOAP请求是套接字连接,因此您可以使用socket_context选项。 使用stream_context_create()将您的请求绑定到指定的IP。

stream_context_create(['socket' => ['bindto' => '123.123.123.123:0']]);

为端口号设置0,以便PHP自动设置。

答案 1 :(得分:0)

除了绑定到特定的IPv4 IP地址之外,您还可以将IP地址替换为0

stream_context_create(['socket' => ['bindto' => '0:0']]);

为SoapClient强制使用IPv4的完整示例可能是:

$opts = array(
    'http' => array(
        'user_agent' => 'Your/UserAgent'
    ),
    'socket' => ['bindto' => '0:0']
);
$context = stream_context_create($opts);

$soapClientOptions = array(
    'stream_context' => $context,
    'trace' => true,
);
$client = new SoapClient($wsdlUrl, $soapClientOptions);