[英]WWW::Mechanize::Timed https timeout does not work
所以我已经研究了关于这个问题的互联网的终点(至少我是这么认为的)。 我正在尝试为get()
设置60秒的alarm
超时但是它不会被捕获并且将超过60秒,也是在www :: mechanized ::达到默认超时(180秒)的任何时间定时构造函数,我得到以下错误:
在/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超时无法使用https以及如何在Perl中执行超时?
到目前为止,我看到了使用LWPx :: ParanoidAgent的建议,不确定我是否理解“使用LWPx :: ParanoidAgent并将其混合到Mech”部分
可以在https上的WWW :: Mechanize中使用超时吗?
或修补LWP :: UserAgent
有关如何使超时与警报一起工作的任何想法?
谢谢!
以下有助于为每个get()
设置一个警报,看起来比使用sig alarm
try-catch容易得多,除非我遗漏了什么?
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;
}
与这个问题几乎相同的答案,但实际的代码如何在Perl中做超时?
来自http://metacpan.org/pod/Sys::SigAction的文字
timeout_call()
$timeout ,$coderef
给定代码引用和超时值(以秒为单位),timeout()将(在eval中)设置SIGALRM的信号处理程序(将死亡),设置闹钟,并执行代码引用。 $ time(秒)可以表示为浮点数。
如果Time :: HiRes存在且可用,则timeout_call()可以使用定时器分辨率0.000001秒。 如果Time:HiRes不可用,那么小于1.0的派系第二个值会被转换为1。
如果警报响起,代码将被中断。 如果代码在触发警报之前返回,则警报将被取消。 如果正在执行的代码超时,则例程返回true。 (被打断了)。 执行的代码抛出的异常会传播出去。
在返回调用者之前,恢复原始信号处理程序。
如果HiRes不可加载,Sys :: SigAction将做正确的事情并进行转换
最后要考虑/记住的事情:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.