我有一个需要连接到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,我达到了这一点。)
到目前为止我做了什么:
我通过服务器终端
仔细检查了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连接到主机?
答案 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);