我有一个soapClient调用,适用于PHP 5.6(RH6)。我们正在将系统升级到PHP 7(RH7,其配置与前一个相同),但同样的调用不起作用。
这是我的代码
$wsdlUrl = "https://THE_URL_I_AM_CALLING/repository/soap/2.1?wsdl";
$sslClientCert = "../../app/config/ssl/ssl_cert.crt";
$sslClientKey = "../../app/config/ssl/ssl_cert.key";
$proxy = 'proxy_http';
$port = 8080;
$contextOptions = [
'ssl' => [
'local_cert' => $sslClientCert,
'local_pk' => $sslClientKey,
'SNI_enabled' => true,
'SNI_server_name' => 'THE_URL_I_AM_CALLING'
]
];
$options= [
"soap_version" => SOAP_1_2,
"features" => SOAP_SINGLE_ELEMENT_ARRAYS,
"stream_context" => stream_context_create($contextOptions),
'proxy_host' => $proxy,
'proxy_port' => $port
];
$client = new SoapClient($wsdlUrl, $options);
try {
// execute the search
$searchResults = $client->searchDocuments([
"text" => "myText",
"hint" => "document"
]);
}
catch (Exception $e) {
echo $e->getMessage();
}
我在PHP 7下得到的错误是
PHP致命错误:未捕获的SoapFault异常:[HTTP]无法连接到主机
如果我使用CURL拨打电话,它可以工作。
我宁愿使用clientSoap让我的生活更轻松。
答案 0 :(得分:1)
我找到了解决方案。把它放在这里所以地球上没有其他灵魂需要经历这场考验。
根据文件 http://php.net/manual/en/context.ssl.php#context.ssl.sni-server-name
SNI_server_name ( string ): 如果设置,则此值将用作服务器名称指示的服务器名称。如果未设置此值,则根据打开流时使用的主机名猜测服务器名称。
注意:不推荐使用此选项,从PHP开始,支持peer_name 5.6.0。
更改后:
'SNI_server_name' => 'THE_URL_I_AM_CALLING'
与
'peer_name' => 'THE_URL_I_AM_CALLING'
有效。