【问题标题】:SoapClient call works on PHP 5.6 but not on PHP 7SoapClient 调用适用于 PHP 5.6 但不适用于 PHP 7
【发布时间】:2017-11-27 13:10:57
【问题描述】:

我有一个可以在 PHP 5.6 (RH6) 上正常工作的soapClient 调用。我们正在将系统升级到 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 让我的生活更轻松。

【问题讨论】:

  • 检查你是否在php7中启用了soap
  • 我查过了。它已启用
  • 你说你在升级,你有没有比较5.6和7之间启用的扩展和设置?由于您无法连接到主机,这听起来像是与 SSL 相关的问题。验证 openssl 扩展是否已启用。我还会尝试将相对 URI 更改为证书文件,以支持使用 dirname(dirname(__DIR__)) . '/app/config/ssl/...' 否则尝试将 "ssl" => array('verify_peer' => false, 'verify_peer_name' => false) 添加到您的 contextOptions,以验证它不是证书问题。您可能需要在 php.ini 中定义 curl.cainfo 和 openssl.cafile
  • 我无法连接到soapClient。但我可以连接 CURL(使用证书和密钥)。 openssl 在新服务器上启用,所有其他设置都相同。当我更新 contextOptions 数组时,我得到 Bad Request

标签: php soap-client php-7


【解决方案1】:

我找到了解决方案。把它贴在这里,这样地球上的其他灵魂就不需要经历这种磨难了。

根据文档 http://php.net/manual/en/context.ssl.php#context.ssl.sni-server-name

SNI_server_name(字符串): 如果设置,则此值将用作服务器名称指示的服务器名称。如果未设置此值,则根据打开流时使用的主机名猜测服务器名称。

注意:从 PHP 开始,该选项已弃用,取而代之的是 peer_name 5.6.0。

更改后:

'SNI_server_name' => 'THE_URL_I_AM_CALLING'

与

'peer_name' => 'THE_URL_I_AM_CALLING'

它有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2021-03-23
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2015-01-21
    相关资源
    最近更新 更多