Perl会话中的LWP::UserAgent代理

Perl会话中的LWP::UserAgent代理,perl,shell,proxy,terminal,lwp-useragent,Perl,Shell,Proxy,Terminal,Lwp Useragent,我需要在一次Perl运行(进程)中更改代理服务器。但始终记住第一个代理值 当我用proxyx.x.x.2启动程序时,此地址始终用作代理 怎么了 简单的程序示例: getHTTP('http://my.com/', "http://x.x.x.1:3128"); getHTTP('http://my.com/', "http://x.x.x.2:3128"); getHTTP('http://my.com/', ""); getHTTP('http://my.com/', "http://x.x.

我需要在一次Perl运行(进程)中更改代理服务器。但始终记住第一个代理值

当我用proxy
x.x.x.2
启动程序时,此地址始终用作代理

怎么了

简单的程序示例:

getHTTP('http://my.com/', "http://x.x.x.1:3128");
getHTTP('http://my.com/', "http://x.x.x.2:3128");
getHTTP('http://my.com/', "");
getHTTP('http://my.com/', "http://x.x.x.3:3128");

sub getHTTP {
    my ($url, $proxy) = @_;
    use LWP::UserAgent;

    my $ua = LWP::UserAgent->new;
    $ua->proxy(http => $proxy);
    my $req = HTTP::Request->new(GET => $url);
    return $ua->request($req)->as_string;
}
HTTP日志的输出:

x.x.x.1 - - [09/Feb/2015:15:28:06 +0100] "GET / HTTP/1.0" 200 3467
x.x.x.1 - - [09/Feb/2015:15:29:07 +0100] "GET / HTTP/1.0" 200 3467
y.y.y.y - - [09/Feb/2015:15:29:08 +0100] "GET / HTTP/1.0" 200 3467
x.x.x.1 - - [09/Feb/2015:15:29:09 +0100] "GET / HTTP/1.0" 200 3467
(y.y.y.y是我的无代理地址)

操作系统:Debian GNU/Linux 7

新发现: 当我运行下一个perl或shell脚本时。与上述结果相同

proxy.sh:

curl -x "http://x.x.x.1:3128" http://my.com/
curl -x "http://x.x.x.2:3128" http://my.com/
curl -x "http://x.x.x.3:3128" http://my.com/
结果:始终为x.x.x.1代理

proxy.pl:

`curl -x "http://x.x.x.4:3128" http://my.com/`;
`curl -x "http://x.x.x.5:3128" http://my.com/`;
`curl -x "http://x.x.x.6:3128" http://my.com/`;
结果:始终为x.x.x.4代理


代理设置似乎无法在一个shell进程中更改。

我不知道这里到底发生了什么,事实上,我认为您可能在LWP中发现了一个bug(如果您向我们展示的是您实际执行的)。但是,您为什么要从HTTP::request而不是直接通过User Agent对象构建GET请求呢?换句话说,与其这样做,不如:

my $req = HTTP::Request->new(GET => $url);
return $ua->request($req)->as_string;
这样做:

my $res = $ua->get($url);
return $res->as_string;

从理论上讲,这两种方法应该是等效的,但我想知道这样做时,代理设置是否没有正确地传播到HTTP::Request。

这看起来很好。它与您正在运行的实际代码不同吗?(我的原始代码要复杂得多。)但当我运行这个简单的示例时,输出是相同的。换句话说,这个简单的程序会导致所描述的行为。这可能是由于代理配置造成的吗?代理是否以某种方式连接以进行负载平衡,或者它们是否可以选择使用哪个接口?我不这么认为。请看我的新发现!在我的简单示例中,没有理由使用HTTP::Request。当我根据您的建议更改代码时,输出是相同的。