2012-10-18 75 views
3

所以我研究了互聯網的兩端(至少我是這麼認爲的)關於這個問題。我試圖爲get()設置一個alarmalarm超時時間,但它不會被捕獲,並且會運行超過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 httpsWays to do timeouts in Perl?

到目前爲止,我看到了使用LWPx :: ParanoidAgent,不知道的建議,如果我理解的 「使用LWPx :: ParanoidAgent並混入機甲」 部分

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

或修補LWP ::用戶代理與

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

有關如何獲取超時以使用警報的任何想法?

謝謝!

+1

[錯誤#57748 ](https://rt.cpan.org/Public/Bug/Display.html?id=57748)可能會導致此問題。我只需使用Time :: HiRes的Sys :: SigAction作爲超時和已用時間。 –

+0

非常感謝您指出這個錯誤。在查看一下Sys :: Sig Action之後(我沒有完全理解它,我第一次遇到它),我能夠實現它,而不必使用Time :: HiRes經過的時間(仍然能夠在WWW ::中使用定時器機械化::定時)。 –

回答

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()將(在一個eval中)設置一個信號處理程序,用於 SIGALRM(將死亡),設置鬧鐘並執行代碼 參考。 $ time(秒)可以表示爲浮點數 。

如果Time :: HiRes存在且可用,timeout_call()可與 一起使用,計時器分辨率爲0.000001秒。如果時間:HiRes不可用 那麼小於1.0的派系第二個值將 傳輸轉換爲1.

如果警報關閉,代碼將被中斷。如果代碼在報警觸發前返回,則報警爲 。如果正在執行的代碼超時,則例程 返回true。 (被打斷)。 執行代碼拋出的異常會傳播出去。

在返回到 調用者之前,恢復原始信號處理程序。

如果高分辨率不可載入,Sys系統:: sigaction的會做正確的事, 轉換

最後一兩件事要考慮/記住:

use of Sys::SigAction::timeout_call unsafe?