PHP 基于 IPv4 的 SOAP 客户端
PHP SOAP client over IPv4
我有一个 PHP 客户端需要连接到 SOAP 服务器:
$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,我才知道这一点)。
到目前为止我做了什么:
- 我已经在我的服务器上禁用了 IPv6 (ubuntu),但这并没有改变
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 连接到主机?
SOAP 请求是套接字连接,因此您可以使用 socket_context 选项。
使用stream_context_create()
将您的请求绑定到指定IP。
stream_context_create(['socket' => ['bindto' => '123.123.123.123:0']]);
为端口号设置 0
,这样 PHP 将自动设置。
除了绑定到特定的 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);
我有一个 PHP 客户端需要连接到 SOAP 服务器:
$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,我才知道这一点)。
到目前为止我做了什么:
- 我已经在我的服务器上禁用了 IPv6 (ubuntu),但这并没有改变 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 连接到主机?
SOAP 请求是套接字连接,因此您可以使用 socket_context 选项。
使用stream_context_create()
将您的请求绑定到指定IP。
stream_context_create(['socket' => ['bindto' => '123.123.123.123:0']]);
为端口号设置 0
,这样 PHP 将自动设置。
除了绑定到特定的 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);