我一直在尝试使用Perl AnyEvent HTTP模块使用以下代码发出异步请求。
my $headers = {
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language'=> 'en-us,en;q=0.5',
'Connection' => 'keep-alive'
};
$request = http_request (
GET => "$url",
timeout => 5, # seconds
# persistent => 1,
# keepalive => 1,
headers => $headers,
proxy => $proxyRef,
sub {
my ($body, $hdr) = @_;
}
);
我不断收到请求中的以下回复:
{
'Reason' => 'Connection timed out',
'URL' => 'url requested',
'Status' => 595
};
我一直在检查AnyEvent文档是否存在此错误,但是没有成功。无法在此问题上找到其他有用的线程,除了重试超时的建议,这会产生相同的结果。一个简单的'wget'在同一个URL上运行并且它活着。有人能指出如何调试这个问题吗?
答案 0 :(得分:2)
“Connction timed out”错误表示底层tcp连接超时。也就是说,当AnyEvent :: HTTP尝试连接到Web服务器或代理时,连接请求超时(通常在大约30秒后)。没有办法可移植地影响这个超时。
具体来说,问题不在于请求本身(尚未输入该阶段),也不是DNS解析,也不是服务器拒绝连接。问题是服务器没有应答,即它已关闭,您与服务器之间的互联网连接失败,或防火墙无声地阻止连接。
<强>更新强>
由于问题略有不同,我刚收到一个遇到此问题的用户的报告 - 他启动了HTTP请求,而不是返回事件循环,他阻止了他的程序超过超时(使用{{ 1}})。换句话说,他启动了HTTP请求,然后使事件库无法工作。当控制最终rturned时,AnyEvent :: HTTP立即超时,因为它无法及时创建连接。
看到你的超时非常小,这很可能是原因 - AnyEvent :: HTTP无法知道连接是否超时是因为服务器/网络延迟还是因为它根本无法获得足够的CPU时间来执行请求在规定的时间内。
在这种情况下的修复方法是将超时设置为方便更长时间,以便即使可用的CPU时间很短,也可以通过运行事件循环并使用计时器而不是睡眠。