php soap_client和socks代理?

时间:2017-05-01 21:00:20

标签: php soap proxy soap-client pear

尝试使用本地创建的SOCKS代理,使用ssh -D通过跳转服务器代理soap调用。

我的网络服务器无法直接访问我尝试使用的设备,所以我想我可以使用SSH代理。

我可以从linux服务器上的Web浏览器中找到wsdl,但是curl失败了。

我已经使用TCP Dump验证了流量从网络接口流出,并且在尝试使用代码时没有达到代理的环回。如果我使用Web浏览器,它会像预期的那样通过环回代理。

    <?

 require_once 'SOAP/Client.php';

$username = "testuser";
$password = "testpass";
$hostname='10.200.96.86';
$soapoptions = array('namespace' => 'urn:iControl'); 
$wsdl_url ="https://$hostname/iControl/iControlPortal.cgi?WSDL=LocalLB.Pool";
$proxy_parms = array( 'user' => $username, 'pass' => $password);
$params = array(); 
$client = new SOAP_Client($wsdl_url, true, '', $proxy_parms );

$client->setOpt('curl', CURLOPT_VERBOSE, true)
$client->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); 
$client->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
$client->setopt('curl', CURLOPT_PROXYTYPE, "CURLPROXY_SOCKS5");
$client->setopt('curl', CURLOPT_PROXY, "localhost:1080"); // 1080 is your -D parameter

$response    = $client->call('get_list', $params, $soapoptions);

if (PEAR::isError($response)) {        
 print "an error occurred in the call " . $response;
}
?>

2 个答案:

答案 0 :(得分:0)

在我想到修复问题后我会说here我需要说,这只适用于“非WSDL”模式。

你有两种可能的WSDL over Socks。

  1. 使用curl(使用SOCKS5选项)自己加载WSDL,并使用上述博客文章中的ProxySoapClient类。并初始化您的客户: new ProxySoapClient($wsdlContentFromCurl, $options);

    但可能是你的WSDL有更多的依赖关系,以后会尝试获取。这不会奏效。所以这是第二种方法:

  2. 使用ssh,polipo和代理选项。

    启动ssh ssh -C2qTnN -D 8081 user@domain这将在端口8081上创建一个SOCKS5代理。启动polipo polipo socksParentProxy=localhost:8081这将在端口8123上创建一个WEB代理到端口8081上的SOCKS5代理。(通常polipo是由inet.d启动,因此您可以在运行本地命令之前停止此操作)

  3. 现在在PHP中使用:

    $client = new SoapClient(
        $theUrlToWSDL,
        [
            'proxy_host' => 'localhost',
            'proxy_port' => 8123,
        ]
    );
    

答案 1 :(得分:-2)

在我想到解决这个问题后,http://www.livingwithphp.com/php-soap-client-socks-proxy/我要说,这只适用于&#34;非WSDL&#34;模式。

你有两种可能的WSDL over Socks。

1。)使用curl(使用SOCKS5选项)自己加载WSDL,并使用上述博客文章中的ProxySoapClient类。并使用以下命令初始化您的客户端:new ProxySoapClient($ wsdlContentFromCurl,$ options);

但可能是你的WSDL有更多的依赖关系,以后会尝试获取。这不会奏效。所以这是第二种方法:

2.。)使用ssh,polipo和代理选项。

启动ssh ssh -C2qTnN -D 8081 user@domain这将在端口8081上创建SOCKS5代理。 启动polipo polipo socksParentProxy=localhost:8081这将在端口8123上创建一个WEB代理到端口8081上的SOCKS5代理。(通常,polipo由inet.d启动,因此你可以在运行本地命令之前停止它)

现在在PHP中使用

$client = new SoapClient(
    $theUrlToWSDL,
    [
        'proxy_host' => 'localhost',
        'proxy_port' => 8123,
    ]
);