【问题标题】:WWW::Mechanize::Timed https timeout does not workWWW::Mechanize::Timed https 超时不起作用
【发布时间】: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 httpsWays to do timeouts in Perl?

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

Possible to use timeout in WWW::Mechanize on https?

或修补 LWP::UserAgent

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

关于如何让超时来处理警报有什么想法吗?

谢谢!

【问题讨论】:

  • Bug #57748 可能会导致此问题。我只是使用 Sys::SigAction 和 Time::HiRes 来表示超时和经过的时间。
  • 非常感谢您指出这个错误。在进一步研究了 Sys::Sig Action 之后(我第一次遇到它时并没有完全理解它)我能够实现它而不必使用 Time::HiRes 来表示经过的时间(仍然能够在 WWW:: 中使用计时器机械化::定时)。

标签: perl https timeout try-catch www-mechanize


【解决方案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

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

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

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

在返回之前,原始信号处理程序已恢复 来电者。

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

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

use of Sys::SigAction::timeout_call unsafe?

【讨论】:

    猜你喜欢
    • 2016-04-12
    • 2012-07-05
    • 2017-04-21
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多