3

所以我已经研究了互联网的尽头(至少我是这么认为的)关于这个问题。我正在尝试为alarma 设置 60 秒的超时,get()但它不会被捕获并且会运行超过 60 秒,而且任何时候达到 www::mechanized::timed 构造函数的默认超时(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 机械化超时不适用于 https在 Perl 中执行超时的方法?

到目前为止,我看到了使用 LWPx::ParanoidAgent 的建议,不确定我是否理解“使用 LWPx::ParanoidAgent 并将其混入 Mech”部分

可以在 https 上的 WWW::Mechanize 中使用超时吗?

或修补 LWP::UserAgent

http://search.cpan.org/~sharyanto/LWP-UserAgent-Patch-HTTPSHardTimeout-0.04/lib/LWP/UserAgent/Patch/HTTPSHardTimeout.pm

关于如何让超时与警报一起工作的任何想法?

谢谢!

4

1 回答 1

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;
}

与这个问题的答案几乎相同,但使用实际代码在 Perl 中进行超时的方法?

来自http://metacpan.org/pod/Sys::SigAction的文本

超时调用()

$timeout ,$coderef

给定一个代码引用和一个超时值(以秒为单位), timeout() 将(在评估中)为 SIGALRM(它将死)设置一个信号处理程序,设置一个闹钟,并执行代码引用。$time (seconds) 可以表示为浮点数。

如果 Time::HiRes 存在且可用,timeout_call() 可以与 0.000001 秒的计时器分辨率一起使用。如果 Time:HiRes 不可用,则小于 1.0 的派系秒值会透明地转换为 1。

如果警报响起,代码将被中断。如果代码在警报触发之前返回,则警报被取消。如果正在执行的代码超时,则例程返回 true。(被打断)。执行的代码抛出的异常被传播出去。

原始信号处理程序在返回给调用者之前被恢复。

如果 HiRes 不可加载,Sys::SigAction 将做正确的事情并转换

最后要考虑/记住的一件事:

使用 Sys::SigAction::timeout_call 不安全?

于 2012-10-22T17:08:45.910 回答