繁体   English   中英

PHP的soap_client和袜子代理?

[英]php soap_client and socks proxy?

一直试图使用通过ssh -D本地创建的SOCKS代理来通过跳转服务器代理肥皂调用。

我的Web服务器无法直接访问我尝试使用的设备,因此我认为我可以使用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;
}
?>

之后,我还以为是固定描述的问题在这里我必须说,这仅适用于“非WSDL”模式。

WSDL over Socks有两种可能性。

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

    但是,可能是您的WSDL具有更多的依赖关系,之后才尝试获取。 这是行不通的。 所以这是第二种方法:

  2. 使用ssh,polipo和proxy选项。

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

现在在PHP中使用:

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

之后,我还以为定影这里所描述的问题http://www.livingwithphp.com/php-soap-client-socks-proxy/我必须说,这仅适用于“非WSDL”模式。

WSDL over Socks有两种可能性。

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

但是,可能是您的WSDL具有更多的依赖关系,之后才尝试获取。 这是行不通的。 所以这是第二种方法:

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

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

现在在PHP中使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM