1

私は 2 つのサーバーを持っています。1 つは開発用に使用され、WEB に簡単にアクセスできますが、もう 1 つは本番用で、プロキシを使用してのみ WEB にアクセスできます。

運用サーバーから SOAP WEB サービスを呼び出したいと考えています。

コードは次のとおりです (URL は偽物です)。

$url = 'https://www.webservice.com/soap.php';
$wsdl = 'https://www.webservice.com/soap.php?wsdl';

$client = new SoapClient
(
        $wsdl,
        array
        (
                'location'      => $url,
                'proxy_host'    => 'www.myproxy.com',
                'proxy_port'    => 8080,
        )
);


$namespace = 'urn:mynamespace';
$header = array
(
        'header1' => 'H1',
        'header2' => 'H2',
        'header3' => 'H3',
);

$client->__setSoapHeaders(new SoapHeader($namespace, 'myHeader', $header));

$params = array
(
        'param1' => 'val1',
        'param2' => 'val2',
        'param3' => 'val3',
);

$result = $client->method($params);

開発サーバーから実行すると、期待どおりの結果が得られます。これを本番サーバーから実行すると、次のようになります。

PHP Warning:  SoapClient::SoapClient(https://www.webservice.com/soap.php?wsdl): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request
PHP Warning:  SoapClient::SoapClient(): I/O warning : failed to load external entity "https://www.webservice.com/soap.php?wsdl" in /home/benji/test.php on line 20
PHP Fatal error:  SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://www.webservice.com/soap.php?wsdl' : failed to load external entity "https://www.webservice.com/soap.php?wsdl"

実稼働サーバーから wsdl を取得すると、次のように動作します。

$ https_proxy=www.myproxy.com wget https://www.webservice.com/soap.php?wsdl
--2013-02-22 10:57:40--  https://www.webservice.com/soap.php?wsdl
Resolving www.myproxy.com... 10.0.0.125
Connecting to www.myproxy.com|10.0.0.125|:8080... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/xml]
Saving to: `soap.php?wsdl'

    [ <=>                                                                                                                                            ] 9 010       --.-K/s   in 0,009s  

2013-02-22 10:57:40 (980 KB/s) - `soap.php?wsdl' saved [9010]
4

1 に答える 1

6

次の解決策は、説明されている問題を解決しました。

  • プロキシ情報も指定する新しいストリーム コンテキストを作成する
  • ストリーム コンテキストでは、オプションSNI_enabledを false に設定します
  • ストリーム コンテキストを options 配列の新しいパラメータとして soapclient に渡します

    $context = stream_context_create(
    array(
        'ssl' => array(
            'SNI_enabled' => false
        ),
        'http' => array(
            'proxy' => 'tcp://yourproxy.com:9999'
        )
    )
    );
    $soapOptions = array(
        'stream_context' => $context
    );
    $soapClient = new SoapClient( 'wsdl.path', $soapOptions );
    
于 2014-07-16T14:30:05.937 に答える