2

我在 Windows 中使用 PHP 脚本发出 curl 请求以成功发出 SOAP 请求,并且我试图准确地追踪这个成功的请求是如何在 C#.NET 中复制它的。

如何使用 PHP 检测curl将使用哪个代理服务器?

我希望php curlcurl_getopt中可能有一个,所以我可以做类似的事情:

curl_getopt(CURLOPT_PROXY);

但可惜它不存在。

有什么方法可以让我找出将通过哪个代理服务器php curl进行连接?

4

3 回答 3

3

1. 你告诉 curl 使用什么代理,而不是 viaversa:

function wget($url)
{
    $options = array(
        CURLOPT_URL             => $url,
        CURLOPT_HEADER          => false,
        CURLOPT_FOLLOWLOCATION  => true,
        CURLOPT_RETURNTRANSFER  => true,
        CURLOPT_TIMEOUT         => 30,
        CURLOPT_PROXY           => '...proxy.ip...',
        CURLOPT_PROXYPORT       => '...proxy.port...',
        CURLOPT_USERAGENT       => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9',
    );
    $ch = curl_init();
    curl_setopt_array($ch, $options);
    $content = curl_exec($ch);
    $error = curl_error($ch);
    return (!$error && $content) ? $content : null;
}

2.另一种解决方案 >

并查看此答案>如何获取先前使用 curl_setopt() 设置的选项?

3. 重写 curl_setopt() 函数

http://php.net/manual/en/function.override-function.php

ps你可能需要http://php.net/manual/en/function.rename-function.php

4.使用runkit覆盖函数

http://php.net/manual/en/book.runkit.php

于 2012-09-27T09:53:24.300 回答
1

如果它使用与您的 Windows 配置相同的配置,您应该能够像这样找到它(未经测试,因为我没有 Windows 服务器):

<?php
    $proxyServerString = shell_exec('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" | find /i "proxyserver"');
    $proxyServerString = trim($proxyServerString);
    /*
        $proxyServerString should be 'ProxyServer    REG_SZ    http=127.0.0.1:8888;https=127.0.0.1:8888'
    */
    preg_match("/ProxyServer *REG_SZ *(.*)/i", $proxyServerString, $match);
    /*
        $match[1] will be something like 'http=127.0.0.1:8888;https=127.0.0.1:8888'
    */
    $proxyServersTemp = explode(";", $match[1]);
    $proxyServers = array();
    foreach ($proxyServersTemp as $proxyServerTemp) {
        preg_match("/^(.*?)=(.*?):(.*?)$/", $proxyServerTemp, $proxyMatch);
        $proxyServers[] = array(
            "protocol" => $proxyMatch[1],
            "address" => $proxyMatch[2],
            "port" => $proxyMatch[3]
        );
    }
    print_r($proxyServers);
?>

$proxyServers现在应该包含如下内容:

Array
(
    [0] => Array
        (
            [protocol] => http
            [address] => 127.0.0.1
            [port] => 8888
        )

    [1] => Array
        (
            [protocol] => https
            [address] => 127.0.0.1
            [port] => 8888
        )

)
于 2012-09-27T10:09:30.043 回答
0

一种方法是,您可以向www.whatismyip.com或类似站点发出 curl 请求并检查 html 响应以找出您正在使用的代理(如果您是)。

于 2012-09-27T09:59:24.433 回答