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,我才知道这一点)。

到目前为止我做了什么:

我的实际问题是:如何告诉 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);