[英]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.