【问题标题】:php soap_client and socks proxy?php soapclient和socks代理?
【发布时间】:2017-05-01 21:00:19
【问题描述】:

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

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

我可以从 linux 服务器上的 Web 浏览器访问 wsdl,但 curl 失败。

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

    <?

 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;
}
?>

【问题讨论】:

    标签: php soap proxy soap-client pear


    【解决方案1】:

    在我认为解决问题被描述为 here 之后,我需要说,这仅适用于“非 WSDL”模式。

    通过 Socks 实现 WSDL 有 2 种可能性。

    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,
        ]
    );
    

    【讨论】:

    • 谢谢你,很好的回答!
    【解决方案2】:

    在我认为这里描述了解决问题之后http://www.livingwithphp.com/php-soap-client-socks-proxy/ 我需要说,这仅适用于“非 WSDL”模式。

    通过 Socks 实现 WSDL 有 2 种可能性。

    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,
        ]
    );
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多