【发布时间】:2012-10-09 11:49:33
【问题描述】:
所以我已经研究了互联网的尽头(至少我是这么认为的)关于这个问题。我正在尝试为 get() 设置 60 秒的 alarm 超时,但它不会被捕获并且会运行超过 60 秒,无论何时达到 www::mechanized 的默认超时(180 秒) ::timed 构造函数,我得到以下错误:
在 /usr/lib/perl5/site_perl/5.10.0/WWW/Mechanize/Timed.pm 第 52 行使用未初始化的值 (+)。
代码:
use WWW::Mechanize::Timed;
use HTTP::Cookies;
use Try::Tiny;
my $ua = WWW::Mechanize::Timed->new(
autocheck => 0#turning off autocheck becuase any get errors will be fatal need to check ourselves
);
my $cookies = HTTP::Cookies->new(
autosave => 1
);
$ua->cookie_jar($cookies);
$ua->agent_alias("Windows IE 6");
try{
local $SIG{ALRM} = sub { die "alarm\n" };
alarm 60;
$ua->get('https://secure.site.com'); #secure site that timed out
alarm 0;
} catch {
die $_ unless $_ eq "alarm\n";
print "page timed out after 60 seconds!\n";
exit;
};
my $total_time = sprintf '%.3f', ($ua->client_elapsed_time);
unless($ua->success){
print "Error: " . $ua->status;
exit;
}
...
我已经研究了这些问题,以弄清楚如何在不编写自己的超时函数的情况下让警报工作。
Perl Mechanize timeout not working with https 和 Ways to do timeouts in Perl?
到目前为止,我看到了有关使用 LWPx::ParanoidAgent 的建议,不确定我是否理解“使用 LWPx::ParanoidAgent 并将其混入 Mech”部分
Possible to use timeout in WWW::Mechanize on https?
或修补 LWP::UserAgent
关于如何让超时来处理警报有什么想法吗?
谢谢!
【问题讨论】:
-
Bug #57748 可能会导致此问题。我只是使用 Sys::SigAction 和 Time::HiRes 来表示超时和经过的时间。
-
非常感谢您指出这个错误。在进一步研究了 Sys::Sig Action 之后(我第一次遇到它时并没有完全理解它)我能够实现它而不必使用 Time::HiRes 来表示经过的时间(仍然能够在 WWW:: 中使用计时器机械化::定时)。
标签: perl https timeout try-catch www-mechanize