SoapClient调用适用于PHP 5.6,但不适用于PHP 7

时间:2017-11-27 13:10:57

标签: php soap-client php-7

我有一个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让我的生活更轻松。

1 个答案:

答案 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'

有效。