所以我研究了这个问题的互联网(至少我是这么认为)。我正在尝试为alarm
设置get()
超时60秒,但它不会被捕获并且将超过60秒,也是在达到默认超时(180秒)的任何时间www :: mechanized :: 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关于如何让超时与警报一起工作的任何想法?
谢谢!
答案 0 :(得分:1)
下面有助于为每个get()
设置一个警报,看起来比使用sig alarm
尝试捕获要容易得多,除非我遗漏了什么?
use Sys::SigAction qw(timeout_call);
if ( timeout_call( 60 ,sub { $ua->get('https://secured.site.com'); } ))
{
print "ALARM page timed out after 60 seconds!\n" ;
exit;
}
与此问题几乎相同的答案,但使用实际代码Ways to do timeouts in Perl?
来自http://metacpan.org/pod/Sys::SigAction 的文字
timeout_call()
$timeout ,$coderef
给出代码引用和超时值(in 秒),timeout()将(在eval中)设置一个信号处理程序 SIGALRM(将死),设置闹钟,并执行代码 参考。 $ time(秒)可以表示为浮点 号。
如果Time :: HiRes存在且可用,则可以使用timeout_call() 计时器分辨率为0.000001秒。如果时间:HiRes不可用 然后将小于1.0的派系第二个值进行转换 到1。
如果闹钟响起,代码将被中断。警报是 如果代码在触发警报之前返回,则取消。例程 如果正在执行的代码超时,则返回true。 (被打断了)。 执行代码抛出的异常会传播出来。
恢复原始信号处理程序,然后返回 呼叫者。
如果HiRes不可加载,Sys :: SigAction将做正确的事情 转换
要考虑/记住的最后一件事: