所以我研究了互聯網的兩端(至少我是這麼認爲的)關於這個問題。我試圖爲get()
設置一個alarm
的alarm
超時時間,但它不會被捕獲,並且會運行超過60秒,並且任何時候對於www :: mechanized :: timed構造函數都會達到默認超時時間(180秒) ,我得到的錯誤如下:在/usr/lib/perl5/site_perl/5.10.0/WWW/Mechanize/Timed.pm線52WWW :: Mechanize ::定時https超時不起作用
代碼除了
使用未初始化值的(+):
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並混入機甲」 部分
Possible to use timeout in WWW::Mechanize on https?
或修補LWP ::用戶代理與
有關如何獲取超時以使用警報的任何想法?
謝謝!
[錯誤#57748 ](https://rt.cpan.org/Public/Bug/Display.html?id=57748)可能會導致此問題。我只需使用Time :: HiRes的Sys :: SigAction作爲超時和已用時間。 –
非常感謝您指出這個錯誤。在查看一下Sys :: Sig Action之後(我沒有完全理解它,我第一次遇到它),我能夠實現它,而不必使用Time :: HiRes經過的時間(仍然能夠在WWW ::中使用定時器機械化::定時)。 –